Output warna tidak konsisten dari perintah `ls`

28

Saya mengajar kursus Pengantar UNIX / Linux di sebuah perguruan tinggi setempat dan salah satu siswa saya mengajukan pertanyaan berikut:

Mengapa beberapa file dalam direktori saya berwarna putih dan yang lainnya berwarna abu-abu? Apakah yang putih yang saya buat hari ini dan abu-abu adalah file yang ada?

Ketika saya melihat ke dalam ini saya pertama kali berpikir jawabannya akan ada dalam LS_COLORSvariabel, tetapi penyelidikan lebih lanjut mengungkapkan bahwa daftar warna berbeda ketika menggunakan -lsakelar versus -alsakelar dengan lsperintah. Lihat tangkapan layar berikut:

menggunakan ls-l file bernama '3' menunjukkan putih

menggunakan -al beralih file yang sama menunjukkan abu-abu

Menggunakan ls -lfile bernama '3' menunjukkan putih tetapi menggunakan -alswitch file yang sama menunjukkan abu-abu.

Apakah ini bug di ls atau ada yang tahu mengapa ini terjadi?

Bill R
sumber
Wrt judul pertanyaan Anda: pewarnaan seperti itu tidak ada hubungannya dengan lsperintah itu sendiri.
Drew
FWIW, cara terdekat yang bisa Anda lakukan dengan mengotak-atik LS_COLORS adalah LS_COLORS='rs=0;1' ls -l, tetapi tampilannya sangat berbeda.
wjandrea
4
@Drew Anda hanya tahu itu setelah menyelidiki masalah. Jelas lsdapat mengubah warna outputnya.
pipa
@pipe: Tidak, saya tahu itu dari jauh sebelum ada warna. Itu tidak perlu memberikan warna, bahkan jika versi terbaru ls dapat memberikan warna. ;-)
Drew

Jawaban:

68

Sepertinya Anda cepat-string ( $PS1) adalah pengaturan atribut tebal pada karakter untuk membuat warna lebih bagus, dan tidak unsetting itu. Output dari lstidak tahu tentang ini, dan tidak disetel dengan huruf tebal. Jadi setelah keluaran warna pertama ls, semuanya tampak redup.

Thomas Dickey
sumber
1
Ya, itu dia. Perubahan warna terakhir dalam set $ PS1 tebal + putih (1; 37) - Terima kasih!
Bill R
3
Anda dapat menandainya diterima.
Thomas Dickey
0

Seluruh output ls akan dicetak dalam warna aktif terakhir . Jika lsdisebut tanpa warna:

$ printf '\e[0;31m color test\n'; /bin/ls
 color test
filea  fileb  filec  filed  filee  filef  fileg  fileh

akan mencetak daftar file dengan warna merah .

Atau, jika tidak ada perubahan warna yang diperlukan untuk ls, warna terakhir akan tetap:

$ mkdir t1; cd t1; touch file{a..h}
$ printf '\e[0;31m color test\n'; /bin/ls --color -l
 color test
total 0
-rw-r--r-- 1 user user 0 Feb 23 01:16 filea
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileb
-rw-r--r-- 1 user user 0 Feb 23 01:16 filec
-rw-r--r-- 1 user user 0 Feb 23 01:16 filed
-rw-r--r-- 1 user user 0 Feb 23 01:16 filee
-rw-r--r-- 1 user user 0 Feb 23 01:16 filef
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileg
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileh

Tetap saja, semuanya berwarna merah.

Tetapi, segera setelah lsperlu mengatur warna (dan kemudian mengatur ulang warna ke default yang digunakan oleh konsol), warna yang digunakan sejak saat itu akan menjadi default konsol.

$ printf '\e[0;31m color test\n'; /bin/ls --color -la
 color test
total 8
drwxr-xr-x 2 user user 4096 Feb 23 01:16 .
drwxr-x--- 7 user user 4096 Feb 23 01:15 ..
-rw-r--r-- 1 user user    0 Feb 23 01:16 filea
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileb
-rw-r--r-- 1 user user    0 Feb 23 01:16 filec
-rw-r--r-- 1 user user    0 Feb 23 01:16 filed
-rw-r--r-- 1 user user    0 Feb 23 01:16 filee
-rw-r--r-- 1 user user    0 Feb 23 01:16 filef
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileg
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileh

Dengan tiga baris pertama (hingga titik biru) dicetak dengan warna merah.

Ishak
sumber