Như michas đã giải thích , đó là những chuỗi thoát cuối cùng. Làm thế nào họ được giải thích là tùy thuộc vào thiết bị đầu cuối. Bạn có thể làm như michas đã đề xuất và gọi ls
như thế \ls
, sẽ gọi hàm ls
thực thi trong $PATH
, thay vì bí danh shell thông thường ls --color=auto
. Để xóa bí danh shell đó bạn có thể làm:
unalias ls
Bạn cũng có thể thêm tùy chọn ...
ls ${opts} --color=never
... Bất cứ lúc nào để tắt nó đi. Một cách khác để vô hiệu hóa các chuỗi màu chẳng hạn là làm:
ls ${opts} | cat
Điều này hoạt động, bởi vì trong --color=auto
chế độ ls
kiểm tra đầu ra của nó để xác định xem nó có phải là một thiết bị tty hay không và nếu vậy, nó sẽ bơm thiết bị đầu cuối thoát ra để tô màu đầu ra của nó. Khi nó không phải là một thiết bị đầu cuối - như khi nó là một |pipe
tệp như trong ví dụ trên - ls
không in các chuỗi thoát. Đây là hành vi tiêu chuẩn của hầu hết các ứng dụng có thể tô màu đầu ra của chúng.
Tuy nhiên, điều thú vị hơn là api mà hầu hết các ls
triển khai cung cấp để kiểm soát hành vi này - điều mà tôi thấy thú vị và điều đó đã thôi thúc tôi viết câu trả lời này.
ls
xác định phần nào của đầu ra của nó để tô màu, dựa trên các giá trị trong $LS_COLORS
biến môi trường. Các dircolors
ứng dụng là một giao diện để xử lý này. Chẳng hạn, trên máy của tôi:
dircolors -p
...
# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
#NORMAL 00 # no color code at all
#FILE 00 # regular file: use no color at all
RESET 0 # reset to "normal" color
DIR 01;34 # directory
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
# numerical value, the color is as for the file pointed to.)
... và như thế. Khi so sánh với...
printf %s "$LS_COLORS"
rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:\
bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:\
ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:...
... Chúng ta có thể bắt đầu có ý tưởng về những gì ls
đang làm. Điều đặc biệt không được hiển thị trong một trong hai điều này, là được biên dịch theo các giá trị cho ...
lc=\e[:rc=m:ec=:
Mỗi trong số này xử lý những gì đi về phía bên trái của mã thoát thiết bị đầu cuối, bên phải của mã thoát thiết bị đầu cuối và kết thúc chuỗi thoát thiết bị đầu cuối. Như bạn có thể thấy trong dircolors
đầu ra, my fi=:
không được đặt làm mặc định - vì thông thường ls
không tô màu các tệp thông thường.
Nhưng nếu chúng ta kết hợp tất cả những thứ này lại với nhau và thêm một chút, chúng ta có thể làm những việc như ...
mkdir dir ; touch file1 file2
LS_COLORS=\
'lc=\nLEFT_SIDE_ESCAPE_SEQUENCE\n:'\
'rc=\nRIGHT_SIDE_ESCAPE_SEQUENCE\n:'\
'ec=\nEND_OF_ESCAPE_SEQUENCE:'\
'fi=REGULAR_FILE_ESCAPE_CODE:'\
'di=DIRECTORY_ESCAPE_CODE:'\
ls -l --color=always | cat -A
total 0$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 $
END_OF_ESCAPE_SEQUENCE$
LEFT_SIDE_ESCAPE_SEQUENCE$
DIRECTORY_ESCAPE_CODE$
RIGHT_SIDE_ESCAPE_SEQUENCE$
dir$
END_OF_ESCAPE_SEQUENCE/$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 $
LEFT_SIDE_ESCAPE_SEQUENCE$
REGULAR_FILE_ESCAPE_CODE$
RIGHT_SIDE_ESCAPE_SEQUENCE$
file1$
END_OF_ESCAPE_SEQUENCE$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 $
LEFT_SIDE_ESCAPE_SEQUENCE$
REGULAR_FILE_ESCAPE_CODE$
RIGHT_SIDE_ESCAPE_SEQUENCE$
file2$
END_OF_ESCAPE_SEQUENCE$
$
LEFT_SIDE_ESCAPE_SEQUENCE$
$
RIGHT_SIDE_ESCAPE_SEQUENCE$
ls
nên in ec
thoát một lần khi bắt đầu đầu ra lc
và rc
thoát và thoát một lần ở cuối. Mỗi lần chúng xảy ra là ngay trước hoặc theo tên tệp. Trình ec
tự chỉ xảy ra nếu nó được đặt - hành vi mặc định là sử dụng reset
hoặc rs
trình tự, thay vào đó kết hợp với lc
và rc
. Đầu ra của bạn hiển thị một cấu hình giống như:
`lc=\033[:rc=m:rs=0...`
... Đó là điển hình, mặc dù ec
cho phép bạn kiểm soát nhiều hơn. Ví dụ, nếu bạn từng muốn một \0
giới hạn null ls
, nó có thể được thực hiện đơn giản như:
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 0$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
^@%
Một lần nữa bạn có thể thấy rằng chúng tôi nhận được thêm một ec
ngay trước khi chuỗi thoát đầu tiên được in và một ở cuối. Ngoài hai điều đó, \0
byte rỗng chỉ xảy ra ngay trước hoặc theo tên tệp. Bạn thậm chí có thể thấy rằng /
dấu gạch chéo bổ sung được sử dụng để chỉ ra một thư mục nằm ngoài các null bao quanh nó.
Điều này cũng hoạt động tốt cho tên tệp chứa dòng mới:
touch 'new
line
file'
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' \
ls -l --color=always | cat -A
total 0$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:43 ^@new$
line$
file^@^@^@$
^@%
Nếu chúng ta kết hợp tất cả những điều này lại với nhau, chúng ta có thể phỏng đoán rằng, trong trường hợp của bạn, có ba vấn đề chính, và nếu một trong hai vấn đề được giải quyết, nó sẽ có khả năng làm khó những người khác.
- Ở nơi đầu tiên, thiết bị đầu cuối của bạn chỉ đơn giản là không hiểu màu của thiết bị đầu cuối thoát chính xác hoặc
plink
theo một cách nào đó khiến chúng không thể đọc được cho thiết bị đầu cuối của bạn. Tôi không chắc đó là sự thật, nhưng các plink
tài liệu có điều này để nói về nó:
Đầu ra được gửi bởi máy chủ sẽ được ghi thẳng vào cửa sổ nhắc lệnh của bạn, rất có thể sẽ không diễn giải các mã điều khiển đầu cuối theo cách mà máy chủ mong đợi. Vì vậy, nếu bạn chạy bất kỳ ứng dụng toàn màn hình nào, chẳng hạn, bạn có thể mong đợi thấy các ký tự lạ xuất hiện trong cửa sổ của mình. Các kết nối tương tác như thế này không phải là điểm chính của Plink.
Để kết nối với một giao thức khác nhau, bạn có thể cung cấp cho các tùy chọn dòng lệnh -ssh
, -telnet
, -rlogin
hoặc -raw
. Để tạo kết nối SSH, ví dụ:
Z:\sysosd>plink -ssh login.example.com
login as:
Nếu bạn đã thiết lập phiên lưu PuTTY, thì thay vì cung cấp tên máy chủ lưu trữ, bạn có thể cung cấp tên phiên đã lưu. Điều này cho phép bạn sử dụng xác thực khóa chung, chỉ định tên người dùng và sử dụng hầu hết các tính năng khác của PuTTY:
Z:\sysosd>plink my-ssh-session
Sent username "fred"
Authenticating with public key "fred@winbox"
Last login: Thu Dec 6 19:25:33 2001 from :0.0
fred@flunky:~$
Nếu một trong hai tùy chọn đó không phù hợp với bạn hoặc không khả thi, thì bạn có thể giải quyết vấn đề này bằng cách có thể chạy một kiểm tra đối với tệp plink
của bạn .${shell}rc
có nguồn gốc khi đăng nhập. Do đó, bạn có thể bật ls
bí danh, chỉ khi thiết bị đăng nhập của bạn không phải là plink
kết nối. Ngoài ra, tôi có thể loại bỏ nó hoàn toàn, tôi cho rằng, nhưng làm như vậy sẽ khiến ls
không màu cho bất kỳ phiên đăng nhập nào. Bạn cũng có thể thêm một unalias ls
hoặc thậm chí một alias ls='ls --color=never
lệnh vào plink
lệnh đăng nhập và do đó chỉ xóa bí danh khi đăng nhập bằng plink
.
Vấn đề cuối cùng là ls
- bất kể các tùy chọn dòng lệnh bí danh của nó - được cung cấp một môi trường chỉ định thiết bị đầu cuối thoát vào $LS_COLORS
. Tương tự như trường hợp sau của vấn đề 2, bạn có thể chỉ cần đặt thành $LS_COLORS
giá trị null khi đăng nhập bằng plink
. Theo cách đó, sẽ không có mã màu để kết xuất và ls --color=auto
sẽ không có sự khác biệt nào cả.