Trong printf '%s\t%s\n' foo bar
, printf
không đầu ra foo<TAB>bar<LF>
.
f
, o
, b
, a
Và r
là nhân vật đồ họa đơn chiều rộng.
Khi nhận được các ký tự đó, thiết bị đầu cuối sẽ hiển thị glyph tương ứng và di chuyển con trỏ một cột sang phải, trừ khi nó đã chạm tới cạnh phải của màn hình (giấy trong máy đánh chữ gốc), trong trường hợp đó, nó có thể cung cấp một dòng và trở về cạnh trái của màn hình (bọc) hoặc chỉ loại bỏ ký tự tùy thuộc vào thiết bị đầu cuối và cách nó được cấu hình.
<Tab>
và <LF>
là hai nhân vật điều khiển . <LF>
(còn gọi là dòng mới) là dấu phân cách dòng trong văn bản Unix, nhưng đối với thiết bị đầu cuối, nó chỉ cung cấp một dòng (di chuyển con trỏ xuống một vị trí). Vì vậy, trình điều khiển đầu cuối trong kernel sẽ thực sự dịch nó sang <CR>
(quay lại cạnh trái của màn hình), <LF>
(con trỏ xuống) ( stty onlcr
thường được bật theo mặc định).
<Tab>
yêu cầu thiết bị đầu cuối di chuyển con trỏ đến điểm dừng tab tiếp theo (mà trên hầu hết các thiết bị đầu cuối cách nhau 8 vị trí nhưng cũng có thể được cấu hình để được đặt ở bất cứ đâu) mà không lấp đầy khoảng trống bằng khoảng trống.
Vì vậy, nếu các ký tự đó được gửi đến một thiết bị đầu cuối có tab dừng mỗi 8 cột trong khi con trỏ ở đầu một dòng trống, điều đó sẽ dẫn đến:
foo bar
in trên màn hình ở dòng đó. Nếu chúng được gửi trong khi con trỏ ở vị trí thứ ba trong một dòng có chứa xxxxyyyyzzzz
, điều đó sẽ dẫn đến:
xxfooyyybarz
Trên các thiết bị đầu cuối không hỗ trợ lập bảng, trình điều khiển thiết bị đầu cuối có thể được cấu hình để dịch các tab đó thành chuỗi các khoảng trắng. ( stty tab3
).
Ký tự SPC, trong máy đánh chữ điện thoại gốc sẽ di chuyển con trỏ sang phải, trong khi backspace ( \b
) sẽ di chuyển nó sang bên trái. Bây giờ trong các thiết bị đầu cuối hiện đại, SPC di chuyển sang phải và cũng xóa (viết một ký tự không gian như bạn mong đợi). Vì vậy, mặt dây chuyền \b
phải là một cái gì đó mới hơn ASCII. Trên hầu hết các thiết bị đầu cuối hiện đại, nó thực sự là một chuỗi các ký tự: <Esc>
, [
, C
.
Có nhiều chuỗi thoát để di chuyển n
nhân vật sang trái, phải, lên, xuống hoặc tại bất kỳ vị trí nào trên màn hình. Có các chuỗi thoát khác để xóa (điền vào chỗ trống) các phần của dòng hoặc vùng trên màn hình, v.v.
Những chuỗi thường được sử dụng bởi các ứng dụng hình ảnh như vi
, lynx
, mutt
, dialog
nơi văn bản được viết ở vị trí tùy ý trên màn hình.
Bây giờ, tất cả các trình giả lập thiết bị đầu cuối X11 và một vài trình giả lập không phải X11 khác như GNU screen
cho phép bạn chọn các khu vực trên màn hình để sao chép dán. Khi bạn chọn một phần của những gì bạn thấy trong vi
trình chỉnh sửa, bạn không muốn sao chép tất cả các chuỗi thoát đã được sử dụng để tạo đầu ra đó. Bạn muốn chọn văn bản bạn nhìn thấy ở đó.
Ví dụ: nếu bạn chạy:
printf 'abC\rAC\bB\t\e[C\b\bD\n'
Mô phỏng phiên soạn thảo nơi bạn nhập abC
, quay lại từ đầu, thay thế ab
bằng AC
, C
bằng B
, di chuyển đến điểm dừng tab tiếp theo, sau đó thêm một cột ở bên phải, sau đó hai cột ở bên trái, sau đó nhập D
.
Bạn thấy:
ABC D
Đó là, ABC
một khoảng cách 4 cột và D
.
Nếu bạn chọn bằng chuột trong xterm
hoặc putty
, chúng sẽ lưu trữ trong vùng chọn ABC
, 4 ký tự khoảng trắng và D
, không abC<CR>AC<BS>B<Tab><Esc>[C<BS><BS>D
.
Những gì kết thúc trong lựa chọn là những gì đã được gửi printf
nhưng được xử lý sau bởi cả trình điều khiển đầu cuối và trình giả lập thiết bị đầu cuối.
Đối với các loại chuyển đổi khác, hãy xem <U+0065><U+0301>
( e
theo sau là một dấu cấp tính kết hợp) được thay đổi thành <U+00E9>
( é
dạng được soạn sẵn) bởi xterm
.
Hoặc echo abc
rằng đầu lên được dịch sang ABC
bằng lái xe thiết bị đầu cuối trước khi gửi đến nhà ga sau một stty olcuc
.
Bây giờ, <Tab>
giống như <LF>
một trong số ít các ký tự điều khiển đôi khi thực sự được tìm thấy trong các tệp văn bản (cũng <CR>
trong các tệp văn bản MSDOS và đôi khi <FF>
để ngắt trang).
Vì vậy, một số trình giả lập thiết bị đầu cuối chọn sao chép chúng khi có thể trong bộ đệm sao chép-dán để bảo quản chúng (thường không phải là trường hợp <CR>
cũng như <LF>
vậy).
Ví dụ, trong các thiết bị đầu cuối dựa trên VTE gnome-terminal
, bạn có thể thấy rằng, khi bạn chọn đầu ra của printf 'a\tb\n'
một dòng trống, gnome-terminal
thực sự lưu trữ a\tb
trong lựa chọn X11 thay vì a
7 khoảng trắng và b
.
Nhưng đối với đầu ra của printf 'a\t\bb\n'
, nó cửa hàng a
, 6 không gian và b
, và cho printf 'a\r\tb\n'
, a
, 7 chỗ và b
.
Có những trường hợp khác mà các thiết bị đầu cuối sẽ cố gắng sao chép đầu vào thực tế, như khi bạn chọn hai dòng sau khi chạy printf 'a \nb\n'
nơi không gian dấu vết vô hình đó sẽ được bảo tồn. Hoặc khi chọn hai dòng không bao gồm ký tự LF khi hai dòng kết quả từ việc bọc ở lề phải.
Bây giờ, nếu bạn muốn lưu trữ đầu ra của printf
vào CLIPBOARD X11
, tốt nhất là thực hiện trực tiếp như sau:
printf 'foo\tbar\n' | xclip -sel c
Lưu ý rằng khi bạn dán nó vào xterm
hoặc hầu hết các thiết bị đầu cuối khác, xterm
thực tế sẽ thay thế \n
bằng \r
vì đó là ký tự xterm
gửi khi bạn nhấn Enter(và trình điều khiển thiết bị đầu cuối có thể dịch lại \n
).