Kiểm tra LS_COLORS trong zsh


10

Vài năm trước tôi đã tìm thấy một đoạn mã thú vị in từng loại tệp theo màu tương ứng theo màu được thiết lập LS_COLORS. Thật không may, tôi không thể nhớ liên kết nữa.

Đây là đoạn trích test_colors.shtrong câu hỏi

eval $(echo "no:global default;fi:normal file;di:directory;ln:symbolic link;pi:named pipe;so:socket;do:door;bd:block device;cd:character device;or:orphan symlink;mi:missing file;su:set uid;sg:set gid;tw:sticky other writable;ow:other w\
ritable;st:sticky;ex:executable;"|sed -e 's/:/="/g; s/\;/"\n/g')                                                                                                                                                                            
{                                                                                                                                                                                                                                           
  IFS=:                                                                                                                                                                                                                                     
  for i in $LS_COLORS                                                                                                                                                                                                                       
  do                                                                                                                                                                                                                                        
    echo -e "\e[${i#*=}m$( x=${i%=*}; [ "${!x}" ] && echo "${!x}" || echo "$x" )\e[m"                                                                                                                                                       
  done                                                                                                                                                                                                                                      
}   

Đoạn mã hoạt động tuyệt vời bash, nhưng không phải trong zshvà tôi không thể biết tại sao. Khi tôi chạy nó, zshtôi gặp lỗi sau:

> sh .test_colors.sh
.eval_colors:1: * not found
[00:fi=00:di=01;34:ln=01;36: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:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.flac=01;35:*.mp3=01;35:*.mpc=01;35:*.ogg=01;35:*.wav=01;35:m

Cập nhật (ngày 1 tháng 11 năm 2011)

Tôi đã thử kịch bản của @ Stéphane Gimenez bên dưới. Tôi nhận thấy rằng một số nhân vật dường như không thoát chính xác. Bất cứ suy nghĩ tại sao?

Trả lời: Xem bình luận về câu trả lời của @ Stéphane Gimenez.

                                                      nhập mô tả hình ảnh ở đây

Câu trả lời:


7

Điều tương tự được viết cho zsh theo cách sạch sẽ hơn nhiều:

#!/bin/zsh

typeset -A names
names[no]="global default"
names[fi]="normal file"
names[di]="directory"
names[ln]="symbolic link"
names[pi]="named pipe"
names[so]="socket"
names[do]="door"
names[bd]="block device"
names[cd]="character device"
names[or]="orphan symlink"
names[mi]="missing file"
names[su]="set uid"
names[sg]="set gid"
names[tw]="sticky other writable"
names[ow]="other writable"
names[st]="sticky"
names[ex]="executable"

for i in ${(s.:.)LS_COLORS}
do
    key=${i%\=*}
    color=${i#*\=}
    name=${names[(e)$key]-$key}
    printf '\e[%sm%s\e[m\n' $color $name
done

Bạn có thể muốn thay thế \nbằng một khoảng trống ở cuối của sự printfgọn nhẹ có thể.
Stéphane Gimenez

Cảm ơn @ Stéphane Gimenez. Tôi đã cập nhật OP của mình với một vấn đề tôi gặp phải khi in một số ký tự sử dụng tập lệnh của bạn. Không chắc chắn nếu điều này có liên quan chặt chẽ đến kịch bản của bạn hay không (nó có thể là thiết bị đầu cuối của riêng tôi?)
Amelio Vazquez-Reina

1
@intrpc: chạy zshnhư shbạn đang sử dụng một số chế độ tương thích. Hoặc gọi kịch bản của bạn là zsh ./test_color_schemehoặc thêm dấu ngoặc kép xung quanh $color$name.
Stéphane Gimenez

@ Stéphane Gimenez: Tôi đã được chuyển đến đây từ câu hỏi liên quan của tôi ở đây: unix.stackexchange.com/questions/52659/ chất . Mở rộng chữ viết tắt của bạn là rất hữu ích. Tôi có ba chữ viết tắt, rs, camhđó không được đưa ở trên. Bạn có thể vui lòng cho tôi biết nơi để tìm mở rộng của họ? Cảm ơn.
chandra

Giải thích từ dircolors -p rs = reset, ca = ability, mh = multi-hard_link
seamabar

3

Bạn cần phải thoát khỏi =trong ${i%=*}vì nếu không thì hậu tố mẫu =*phải trải qua =việc mở rộng , vì vậy =được xem như là một tên lệnh. Đây là nguyên nhân của * not foundlỗi.

Zsh không phân chia các từ thay thế theo mặc định, do đó $LS_COLORSmở rộng thành một từ duy nhất. Để forvòng lặp hoạt động trên các phần được phân tách bằng dấu hai chấm $LS_COLORS, hãy sử dụng for i in $=LS_COLORS. Hoặc thành ngữ hơn trong zsh, không sử dụng IFSmà thay vào đó chỉ định rõ ràng cách phân chia : for i in ${(s.:.)LS_COLORS}.

Cú pháp ${!x}có nghĩa là giá trị của biến có tên là tên $xlà đặc trưng cho bash. Zsh có cấu trúc tương đương, P cờ mở rộng tham số : ${(P)x}.


1
Có hai lý do nữa cho kịch bản này không hoạt động trong zsh. Không có phân tách từ tự động cho LS_COLORS=cần phải được thoát trong các mẫu thay thế.
Stéphane Gimenez

@ StéphaneGimenez Bạn nói đúng, cảm ơn, tôi chỉ nhấn vào nơi bash không chuẩn nhưng đây là hai tính năng zsh không chuẩn cũng cần được giải quyết. Bạn nên mở rộng câu trả lời của mình để có tất cả các giải thích, và sau đó tôi có thể xóa câu trả lời của mình.
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.