Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Cách in dòng mới trong đầu ra dòng lệnh

Đáng ngạc nhiên là việc đưa máy tính cung cấp cho con người đầu ra có thể đọc được không phải là điều dễ dàng. Với sự ra đời của các luồng tiêu chuẩn và đầu ra tiêu chuẩn cụ thể, các chương trình đã đạt được một cách để nói chuyện với nhau bằng cách sử dụng các luồng văn bản thuần túy. Nhưng nhân hóa và hiển thị stdout là một vấn đề khác. Công nghệ trong suốt thời đại điện toán đã cố gắng giải quyết vấn đề này, từ việc sử dụng các ký tự ASCII trong màn hình máy tính video đến các lệnh shell hiện đại như echoprintf .

Những tiến bộ này không được liền mạch. Công việc in kết quả đầu ra tới một thiết bị đầu cuối đầy rẫy những điều khó hiểu đối với các lập trình viên để điều hướng, ví dụ như nhiệm vụ không hề đơn giản là mở rộng một chuỗi thoát để in các dòng mới. Việc mở rộng trình giữ chỗ \n có thể được thực hiện theo nhiều cách, mỗi cách đều có lịch sử và sự phức tạp riêng.

Sử dụng echo

Từ sự xuất hiện của nó trong Multics đến sự phổ biến của hệ thống giống Unix ngày nay, echo vẫn là một công cụ quen thuộc để khiến thiết bị đầu cuối của bạn nói “Xin chào thế giới!” Thật không may, việc triển khai không nhất quán giữa các hệ điều hành làm cho việc sử dụng nó trở nên phức tạp. Ở đâu echo trên một số hệ thống sẽ tự động mở rộng trình tự thoát, những hệ thống khác yêu cầu -e tùy chọn để làm tương tự:

echo "the study of European nerves is \neurology"
# the study of European nerves is \neurology

echo -e "the study of European nerves is \neurology"
# the study of European nerves is 
# eurology

Do những mâu thuẫn này trong việc triển khai, echo được coi là không di động. Ngoài ra, việc sử dụng nó kết hợp với đầu vào của người dùng tương đối dễ bị hỏng thông qua cuộc tấn công chèn vỏ bằng cách sử dụng thay thế lệnh.

Trong các hệ thống hiện đại, nó chỉ được giữ lại để cung cấp khả năng tương thích với nhiều chương trình vẫn sử dụng nó. Đặc tả POSIX khuyến nghị sử dụng printf trong các chương trình mới.

Sử dụng printf

Kể từ Unix phiên bản thứ 4, printf di động về cơ bản là lệnh echo mới và tốt hơn . Nó cho phép bạn sử dụng các chỉ định định dạng để nhân hóa đầu vào. Để diễn giải chuỗi thoát dấu gạch chéo ngược, hãy sử dụng %b . Chuỗi ký tự \n đảm bảo đầu ra kết thúc bằng một dòng mới:

printf "%b\n" "Many females in Oble are \noblewomen"
# Many females in Oble are 
# oblewomen

Mặc dù printf có các tùy chọn khác giúp nó thay thế echo mạnh mẽ hơn nhiều , tiện ích này không an toàn và có thể dễ bị tấn công chuỗi định dạng không kiểm soát. Điều quan trọng đối với các lập trình viên là đảm bảo họ xử lý thông tin đầu vào của người dùng một cách cẩn thận.

Đặt dòng mới trong biến

Trong nỗ lực cải thiện tính di động giữa các trình biên dịch, Tiêu chuẩn ANSI C đã được thành lập vào năm 1983. Với việc trích dẫn ANSI-C bằng cách sử dụng $'...' , trình tự thoát được thay thế trong đầu ra theo tiêu chuẩn.

Điều này cho phép chúng tôi lưu trữ các chuỗi có dòng mới trong các biến được in với dòng mới được diễn giải. Bạn có thể thực hiện việc này bằng cách đặt biến, sau đó gọi nó bằng printf sử dụng $ :

puns=$'\number\narrow\nether\nice'

printf "%b\n" "These words started with n but don't make $puns"

# These words started with n but don't make 
# umber
# arrow
# ether
# ice

Biến được mở rộng là một dấu ngoặc kép, được chuyển theo nghĩa đen cho printf . Như mọi khi, điều quan trọng là phải xử lý đầu vào đúng cách.

Phần thưởng:mở rộng thông số shell

Trong bài viết giải thích về Bash và các dấu ngoặc nhọn, tôi đã đề cập đến sự kỳ diệu của việc mở rộng tham số shell. Chúng tôi có thể sử dụng một phần mở rộng, ${parameter@operator} , để giải thích các trình tự thoát. Chúng tôi sử dụng printf Của %s mã xác định để in dưới dạng chuỗi và E toán tử sẽ mở rộng đúng trình tự thoát trong biến của chúng tôi:

printf "%s\n" ${puns@E}

# umber
# arrow
# ether
# ice

Thử thách đang diễn ra khi nói chuyện với con người

Nội suy chuỗi tiếp tục là một vấn đề nan giải đối với các lập trình viên. Bên cạnh việc khiến các ngôn ngữ và trình bao đồng nhất với nhau về ý nghĩa của một số trình giữ chỗ nhất định, việc sử dụng đúng trình tự thoát đúng cách đòi hỏi bạn phải chú ý đến từng chi tiết.

Nội suy chuỗi kém có thể dẫn đến đầu ra trông ngớ ngẩn, cũng như tạo ra các lỗ hổng bảo mật, chẳng hạn như từ các cuộc tấn công tiêm. Cho đến khi sự phát triển tiếp theo của thiết bị đầu cuối cho phép chúng ta nói chuyện bằng biểu tượng cảm xúc, chúng ta nên chú ý nhất khi in đầu ra cho con người.