แแฆแแก แแแแแแ แแแกแแฃแแ แแ แจแแ แแแแแก แกแแกแขแแแแก แฃแแฎแแแก แแแแแฎแแแแแแแ [แแก แแ แแก แกแขแแแคแแ แแแก แฃแแแแแ แกแแขแแขแแก แแแฆแแแ แฎแแ แแกแฎแแก แแแแกแขแแ แ - แแแแฎแ. trans.], แ แแช แแแแจแแแแแแแแแ แแฉแฅแแ แแแก แคแแแแแแแก แฉแแแแแแแแแแก แแแ แแฅแขแแ แแแจแ แแแแ แ แแแแแแแแแ แฉแแแแฌแแ แแแแ.
แฉแแแฃแแแแ แแแ แกแขแแขแแแแแกแแแ แแแแกแฎแแแแแแแ, แแก แฃแคแ แ แแแขแแ แแ แแก แแแกแแแแแ แแก แแแฎแกแแแแแ แแแแก แจแแกแแฎแแ, แแฃ แ แแแแ แแแฃแจแแแแ แ แแแฃแแแ แฃแแแ Sherlock-แแ, แ แแแ แแก แกแแฃแแแแแกแแ แแฃแจแแแแแแก แฉแแแแ แแแแฎแแแ แแแแแแแกแแแแก. แแแแแแแแแแแ, แ แแ แแแแแแแแจแ แแแแแ แแแแแแแฅแแแงแแแแ แแกแแแแก แกแขแแขแแแแก.
แแแแ แ แคแแแแแก แฉแแแแแแแแก แแ แ แกแญแแ แแแแ
แแก แงแแแแแคแแ แ แแแแฎแแแ แแแแแก แขแแฅแแแแฃแ แ แแแฎแแแ แแแแก แแแแฎแแแ แแแแฌแงแ. แแแ แแแแฎแกแแแ แแ แแแแแแ, แ แแ แแฆแกแ แฃแแแแ ls
แ แแแแแแแแ แฌแฃแแ แกแญแแ แแแแ แแแ แแฅแขแแ แแแจแ 15-แแ แแแขแ แฉแแแแฌแแ แแ $SCRATCH
[แแ แแแแแแ แคแแแแแแแก แแแ แแฅแขแแ แแ - แแแแฎแ. แจแแกแแฎแแแแ].
แแแแกแแแแ แคแแแแ แแ แ แแแ แแฅแขแแ แแแจแ แฉแแแฃแแแแ แแ แแแซแแแแแก แคแแแแฃแ แกแแกแขแแแแก แแ แแแแแแแแแ แแ แแ แแก แ แแแแแแแแแแฃแแ. แแแแฎแแแ แแแแแแ แแชแแแ แแก แแ แแฆแแแ แ, แ แแ แแก แแ แแงแ แแแ แแ, แแแแ แแ แแฆแแแจแแ, แ แแ แกแแ แแแก แแแแขแแแแ 1000-แฏแแ แฃแคแ แ แกแฌแ แแคแ แแงแ, แแแแ แ แจแแ แแแแ. แ แ แแฅแแ แฃแแแ, แแแแ แแแแแแแแ แแแ. แแกแ แฃแคแ แ แฆแ แแแ แฉแแแแฎแแแแ.
แแแแขแแ แ แแ แแแแแแแ แแแแแแงแฃแ แแแ
แฉแแแ แจแแแฎแแแแ แ แแก แแแแแแแก แแก แกแแแแแแแแแแจแ ls
แแแ แแฅแขแแ แแแก แฉแแแแแแแแกแแก แแ แ แแขแแ แแฆแแแก แแ แแชแแกแ แแแแแ แฎแแแก. แฃแแแขแแก แแแแแแแแ แแแ แแแกแขแ แแแฃแชแแแแแ ls
แแแแฃแแแกแฎแแแแแ แแฃแจแแแแก แ แแแแ แช ls --color=auto
, แแแแขแแ แ แแ แคแแ แแแ แงแแแแแก แแแกแฌแแแก.
แแแแ แแ แแแแแ แคแแ แแแก แคแแกแ แแฅแแก: แงแแแแ แคแแแแก ls
แฃแแแ แแแแแแแแก แแแคแแ แแแชแแ แคแแแแแก แขแแแแก, แแแกแ แแแแแ แแแแแแก, แแ แแจแแแแก, แแแคแแ แแแแแฃแแ แแขแ แแแฃแขแแแแกแ แแ แแกแแแแกแแก แจแแกแแฎแแ, แ แแแ แจแแแ แฉแแแก แจแแกแแแแแแกแ แคแแ แ.
แแ แแแแแแแก แแ แ-แแ แแ แแแ แขแแแ แแแแแกแแแแแ แแ แแก ls-แจแ แคแแ แแก แแแแแแแแ แแแแแ แแแ, แแแแ แแ แฌแแ แแแแแแแแแ แแแแฎแแแ แแแแแแแก แแฆแจแคแแแแแ. แแ แแแแแแ แจแแแแฎแแแแแจแ แแ แฃแแแ แฌแแแ แแแแ แคแแ แแก แแแแแกแแแแแ, แฉแแแ แแ แแแ แ แแแแกแขแ แแแ.
แแกแ แฃแคแ แ แฆแ แแแ แฉแแแแฎแแแแ. ls
แคแแ แแแแก แฉแแแแฌแแ แแแ แแแ แแแแก แชแแแแแแก แกแแจแฃแแแแแแ LS_COLORS
, แ แแแแแแช แแแงแแแแแฃแแแ dircolors(1)
แแแแคแแแฃแ แแชแแแก แคแแแแแ แแแงแ แแแแแแ dir_colors(5)
... แแแแฎ,
แแแแแ แฃแคแ แ แแฎแแแก แแแแฎแแแแ
แแแแก แแแกแแแแแแแ, แแฃ แ แแแแแ แคแแ แแก แกแฅแแแ แแฌแแแแก แจแแแแแแแแก, แฉแแแ แจแแแฅแแแแแ แแฅแกแแแ แแแแแขแฃแแ แแแ แแแ:
$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # don't try this at home!
$ time ls --color=always $SCRATCH/dont | wc -l
10000
real 0m12.758s
user 0m0.104s
sys 0m0.699s
12,7 แฌแแแ 10 แคแแแแแกแแแแก, แแ แช แแกแ แแแ แแ.
แกแฎแแแแ แจแแ แแก, แแ แแจแ แแแญแแ แแแแ
--color=always
: แแฃแแชแ แแก แแแฃแแ แฃแแแแแls --color=auto
แแแแ แแls
แแฆแแแแฉแแแก, แ แแแแกแแช แแก แแ แแ แแก แแแแแแจแแ แแแฃแแ แขแแ แแแแแแแแ (แแแ. แแแแแ แแ แแแแแแแแแแ แแแแแแแกแแแแ แแแแแ) แแ แแแจแแแก แจแแฆแแแแแก, แแฃ แแแงแแแแแฃแแแauto
. แญแแแแแแ แแแญแ.
แแแจ, แ แแก แญแแ แแแแ แแแแแแ แแ แ? แแแ แแฃแงแฃแ แแแแแ strace
:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
44.21 0.186617 19 10000 lstat
42.60 0.179807 18 10000 10000 getxattr
12.19 0.051438 5 10000 capget
0.71 0.003002 38 80 getdents
0.07 0.000305 10 30 mmap
0.05 0.000217 12 18 mprotect
0.03 0.000135 14 10 read
0.03 0.000123 11 11 open
0.02 0.000082 6 14 close
[...]
แแแ: 10 แแแ แ lstat()
, 10 แแแ แ getxattr()
(แ แแช แงแแแแ แแแ แฎแแ แฎแแแแ, แ แแแแแ แฉแแแแก แแแ แแแแก แแ แแฅแแก แแก แแขแ แแแฃแขแแแ, แ แแกแแช ls แแซแแแก), 10 แแแ แ capget()
.
แ แ แแฅแแ แฃแแแ, แแแแก แแแขแแแแแแชแแ แจแแกแแซแแแแแแแ.
แจแแกแแซแแแแแแแแแแก แแขแ แแแฃแขแ? แแ แ
แ แฉแแแแก แจแแแแแ
$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:/)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
98.95 0.423443 42 10000 lstat
0.78 0.003353 42 80 getdents
0.04 0.000188 10 18 mprotect
0.04 0.000181 6 30 mmap
0.02 0.000085 9 10 read
0.02 0.000084 28 3 mremap
0.02 0.000077 7 11 open
0.02 0.000066 5 14 close
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.427920 10221 6 total
real 0m8.160s
user 0m0.115s
sys 0m0.961s
แแแ, 8 แฌแแแแแแ แแฉแฅแแ แแแ! แฉแแแ แแแแแแแแกแฃแคแแแแ แงแแแแ แแ แซแแแ แแแฆแแ แแแฃแแ แแแ แแกแแแ getxattr()
แแ แแแแแฌแแแแแแ capget()
แแแฅแ แ แซแแแแแ แแแ แแ.
แแแแ แแ แแแแแช แแ แแก แแก แจแแแแจแคแแแแแแแ แแแ แแแ lstat()
, แแฃแแชแโฆ
แ แแแแแแ แงแแแแแแ แแญแแ แแแแแ?
แแแแขแแ, แฉแแแ แฃแคแ แ แแแขแแแฃแ แแ แแแแแแฎแแแแ LS_COLORS
.
แฏแแ แฃแแ แแแแ แแแแแ แแแ แแก แชแแแแแ:
$ echo $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=:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=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:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: $ unset LS_COLORS $ echo $LS_COLORS $ time ls --color=always $SCRATCH/dont | wc -l 10000 real 0m13.037s user 0m0.077s sys 0m1.092s
แฒ แ!?! แแแแแ 13 แฌแแแ?
แแแแแแแก, แ แแ แ แแแแกแแช แแแ แแแแก แชแแแแแ LS_COLORS
แแแกแ แแฎแแแแ แแ แแ แแแแแแแขแ แแ แแ แแก แแแแกแแแฆแแ แฃแแ แแ แแแแแ <type>=color:
, แแก แแงแแแแแก แฉแแจแแแแแฃแ แแแแแชแแแแ แแแแแก แแแแฃแแแกแฎแแแแแ แแ แแแแแ แแงแแแแแก แคแแ แแแก. แแกแ แ แแ, แแฃ แแกแฃแ แ แแแแแ แแแ แจแแฆแแแแ แแแ แแแแฃแแ แคแแแแแก แขแแแแกแแแแก, แแฅแแแ แฃแแแ แแแแฃแฅแแแ แแแ <type>=:
แแ <type> 00
แคแแแแจแ DIR_COLORS
.
แแแแ แ แชแแแกแ แแ แจแแชแแแแแก แจแแแแแ, แฉแแแ แจแแแแแชแแ แแ แฉแแแแ แซแแแแ แจแแแแแแแ:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
แ แแแแแแช แแฌแแ แแแ แ แแแแ แช
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
แแก แแแจแแแแก: แแฃ แแแแคแแ แแแแแ แคแแแแแแก แแขแ แแแฃแขแแก แแแฎแแแแแ.
, แแ แช แแแแ
แแแฉแฅแแ แแแ ls
แแ แแฃ แแ แจแแแแฌแแแแแก แแ แแแแแแแแแ, แแแจแแ แแแ แแแแ lstat()
แแแฅแ แแแ แแ แแฎแแ แกแฃแ แกแฎแแ แกแแฅแแแ:
$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
63.02 0.002865 36 80 getdents
8.10 0.000368 12 30 mmap
5.72 0.000260 14 18 mprotect
3.72 0.000169 15 11 open
2.79 0.000127 13 10 read
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.004546 221 6 total
real 0m0.337s
user 0m0.032s
sys 0m0.029s
0,3 แฌแแแ 10 แคแแแแแก แกแแแจแ, แ แแแแ แแ.
แจแแ แแแแแก แแแงแแแแแ
แแแแฃแแแกแฎแแแแ แแแ แแแแขแ แแแแ 13 แฌแแแแแแ 0,3 แฌแแแแแแ แแชแแ แ แแแ แแฅแขแแ แแแแ LS_COLORS
แแแจแแแแก แแ แแ แกแแแแแแก แแแแ 40-แฏแแ แแฉแฅแแ แแแแก setuid
/ setgid
แแ แคแแ แแแ แจแแกแ แฃแแแแแแ แคแแแแแแ. แแ แช แแกแ แแแแ แแแแแแแ แแแ.
แ แ แแฅแแ แฃแแแ, แแก แแฎแแ แแแแคแแแฃแ แแแฃแแแ แจแแ แแแแจแ แแแแแแฃแแ แแแแฎแแแ แแแแแกแแแแก.
แแแแ แแ แแฃ แแกแฃแ แ แจแแฆแแแแแก แแแแ แฃแแแแ, แจแแแแซแแแแ แฃแแ แแแแ แแแฃแแ แฃแแแแ แแแแฃแแแกแฎแแแ แแแ แแแแขแ แแแก:
$ unset LS_COLORS
แแแแ แแ แจแแแแแ แแแ แแฅแขแแ แแแจแ, แกแแแแช แแแแ แ แคแแแแแ, แแแ แฌแแฃแแแแ, แ แแ แแแฎแแ แจแแ แงแแแ, แกแแแแ แแก แแฃแจแแแแก ls
.
แฌแงแแ แ: www.habr.com