ื›ืืฉืจ ืžืฉืชื ื” ืกื‘ื™ื‘ื” ืžืื™ืฅ ืืช ื”ืชื”ืœื™ืš ืคื™ 40

ื”ื™ื•ื ืื ื—ื ื• ืจื•ืฆื™ื ืœื“ื‘ืจ ืขืœ ื›ืžื” ืžื”ืขื“ื›ื•ื ื™ื ื”ืื—ืจื•ื ื™ื ืœืžืขืจื›ืช ืฉืจืœื•ืง [ื–ื”ื• ืืฉื›ื•ืœ ื‘ืขืœ ื‘ื™ืฆื•ืขื™ื ื’ื‘ื•ื”ื™ื ื‘ืื•ื ื™ื‘ืจืกื™ื˜ืช ืกื˜ื ืคื•ืจื“ - ื‘ืขืจืš. trans.], ืžื” ืฉืžืื™ืฅ ืžืฉืžืขื•ืชื™ืช ืืช ืจื™ืฉื•ื ื”ืงื‘ืฆื™ื ื‘ืกืคืจื™ื•ืช ืขื ืžืกืคืจ ืจื‘ ืฉืœ ืขืจื›ื™ื.

ื‘ื ื™ื’ื•ื“ ืœืžืืžืจื™ื ืจื’ื™ืœื™ื, ื–ื” ื™ื•ืชืจ ื“ื™ื•ื•ื— ืฉืœ ืžื‘ืคื ื™ื ืขืœ ื”ืื•ืคืŸ ืฉื‘ื• ืื ื• ืขื•ื‘ื“ื™ื ื‘ืื•ืคืŸ ืงื‘ื•ืข ืขืœ ืฉืจืœื•ืง ื›ื“ื™ ืœืฉืžื•ืจ ืขืœื™ื• ืœืคืขื•ืœ ื‘ืžื™ื˜ื‘ื• ืขื‘ื•ืจ ื”ืžืฉืชืžืฉื™ื ืฉืœื ื•. ืื ื• ืžืงื•ื•ื™ื ืœืคืจืกื ืžืืžืจื™ื ื ื•ืกืคื™ื ื›ืžื• ื–ื” ื‘ืขืชื™ื“.

ืจื™ืฉื•ื ืงื‘ืฆื™ื ืจื‘ื™ื ืœื•ืงื— ื–ืžืŸ

ื”ื›ืœ ื”ืชื—ื™ืœ ื‘ืฉืืœืช ืชืžื™ื›ื” ื˜ื›ื ื™ืช ืฉืœ ืžืฉืชืžืฉ. ื”ื•ื ื“ื™ื•ื•ื— ืขืœ ื”ื‘ืขื™ื” ืฉื‘ื”ื•ืฆืื” ืœื”ื•ืจื’ ls ืœื•ืงื— ื›ืžื” ื“ืงื•ืช ื‘ืกืคืจื™ื™ื” ืขื ืœืžืขืœื” ืž-15 ืขืจื›ื™ื $SCRATCH [ืกืคืจื™ื™ื” ืœืงื‘ืฆื™ื ื–ืžื ื™ื™ื - ื›. ื ืชื™ื‘].

ืืœืคื™ ืงื‘ืฆื™ื ื‘ืกืคืจื™ื™ื” ืื—ืช ืžื”ื•ื•ื™ื ื‘ื“ืจืš ื›ืœืœ ืขื•ืžืก ืขืœ ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ื•ื‘ื”ื—ืœื˜ ืœื ืžื•ืžืœืฅ. ื”ืžืฉืชืžืฉ ื™ื“ืข ื–ืืช ื•ื”ื•ื“ื” ืฉื–ื” ืœื ื˜ื•ื‘, ืื‘ืœ ืฆื™ื™ืŸ ืฉื”ืจื™ืฉื•ื ืžื”ื™ืจ ืคื™ 1000 ื‘ืžื—ืฉื‘ ื”ื ื™ื™ื“ ืฉืœื• ืžืืฉืจ ืฉืจืœื•ืง. ื›ืžื•ื‘ืŸ ืฉื–ื” ืคื’ืข ื‘ื ื•. ืื– ื”ืกืชื›ืœื ื• ืœืขื•ืžืง.

ื›ื™ ื–ื” ื ืจืื” ื ื—ืžื“

ื‘ื“ืงื ื• ืžื” ื–ื” ืขื•ืฉื” ื‘ืคื•ืขืœ ls ื‘ืขืช ืจื™ืฉื•ื ืกืคืจื™ื™ื”, ื•ืžื“ื•ืข ื”ืชื”ืœื™ืš ืœื•ืงื— ื›ืœ ื›ืš ื”ืจื‘ื” ื–ืžืŸ. ื‘ืจื•ื‘ ื”ื”ืคืฆื•ืช ื”ืžื•ื“ืจื ื™ื•ืช ls ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื”ื•ื ืคื•ืขืœ ื› ls --color=auto, ื›ื™ ื›ื•ืœื ืื•ื”ื‘ื™ื ืืช ื”ืฆื‘ืขื™ื.

ืื‘ืœ ืœืฆื‘ืขื™ื ื™ืคื™ื ื™ืฉ ืžื—ื™ืจ: ืœื›ืœ ืงื•ื‘ืฅ ls ื—ื™ื™ื‘ ืœืงื‘ืœ ืžื™ื“ืข ืขืœ ืกื•ื’ ื”ืงื•ื‘ืฅ, ื”ืจืฉืื•ืชื™ื•, ื“ื’ืœื™ื, ืชื›ื•ื ื•ืช ืžื•ืจื—ื‘ื•ืช ื•ื›ื“ื•ืžื” ืขืœ ืžื ืช ืœื‘ื—ื•ืจ ืืช ื”ืฆื‘ืข ื”ืžืชืื™ื.

ืคืชืจื•ืŸ ืคืฉื•ื˜ ืื—ื“ ืœื‘ืขื™ื” ื”ื•ื ืœื”ืฉื‘ื™ืช ืืช ื”ืฆื‘ืข ื‘-ls ืœื—ืœื•ื˜ื™ืŸ, ืื‘ืœ ืชืืจื• ืœืขืฆืžื›ื ืืช ื”ื–ืขื ืฉืœ ื”ืžืฉืชืžืฉื™ื. ื‘ืฉื•ื ืคื ื™ื ื•ืื•ืคืŸ ืืกื•ืจ ืœืงื—ืช ืืช ืคืœื˜ ื”ืฆื‘ืข, ืื ื—ื ื• ืœื ืžืคืœืฆื•ืช.

ืื– ื”ืกืชื›ืœื ื• ืœืขื•ืžืง. ls ืขืจื›ื™ื ืฉืœ ืฆื‘ืขื™ื ื‘ืืžืฆืขื•ืช ืžืฉืชื ื” ืกื‘ื™ื‘ื” LS_COLORS, ืืฉืจ ื ืงื‘ืข dircolors(1) ืžื‘ื•ืกืก ืขืœ ืงื•ื‘ืฅ ืชืฆื•ืจื” dir_colors(5)... ื›ืŸ, ืงื•ื‘ืฅ ื”ื”ืคืขืœื” ืงื•ืจื ืืช ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ื›ื“ื™ ืœื™ืฆื•ืจ ืžืฉืชื ื” ืกื‘ื™ื‘ื”, ืฉื‘ื• ื”ื•ื ืžืฉืชืžืฉ ืœืื—ืจ ืžื›ืŸ (ื•ืื ืืชื” ืœื ื™ื•ื“ืข ืขืœ ืงื‘ืฆื™ื ื“ืœืช (do), ื•ืื– dir_colors ื™ืขื‘ื•ื“, ืœืžืจื•ืช ื”ื›ืœ).

ื‘ื•ืื• ื ืกืชื›ืœ ืžืงืจื•ื‘

ื›ื“ื™ ืœืงื‘ื•ืข ืื™ื–ื• ืขืจื›ืช ืฆื‘ืขื™ื ื’ื•ืจืžืช ืœื”ืื˜ื”, ื™ืฆืจื ื• ืกื‘ื™ื‘ืช ื ื™ืกื•ื™:

$ 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() (ืฉื›ื•ืœื ื ื›ืฉืœื™ื ื›ื™ ืœืกื‘ื™ื‘ื” ืฉืœื ื• ืื™ืŸ ืืช ื”ืชื›ื•ื ื•ืช ืฉืื ื™ ืžื—ืคืฉ), 10 ืฉื™ื—ื•ืช capget().

ืื™ืŸ ืกืคืง ืฉืืคืฉืจ ืœื™ื™ืขืœ ืืช ื–ื”.

ืชื›ื•ื ืช ื™ื›ื•ืœื•ืช? ืœื

ื‘ืขืงื‘ื•ืช ืขืฆื•ืช ื‘ืื’ ืžืœืคื ื™ 10 ืฉื ื™ื, ื ื™ืกื™ื ื• ืœื”ืฉื‘ื™ืช ืืช ื‘ื“ื™ืงืช ื”ืชื›ื•ื ื•ืช ื™ื›ื•ืœื•ืช:

$ 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:'

ื–ื” ืื•ืžืจ: ืืœ ืชืฆื‘ืข ืงื‘ืฆื™ื ืœืคื™ ืชื›ื•ื ื”. ื™ื›ื•ืœื•ืช, ืื‘ืœ ื˜ื™ืคื™ืŸ ื˜ื™ืคื™ืŸ setuid/setgid, ื’ื ืœื ืขืœ ื™ื“ื™ ื“ื’ืœ ื™ื›ื•ืœืช ื‘ื™ืฆื•ืข.

ืื ื—ื ื• ืžืื™ืฆื™ื 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 ื•ืงื‘ืฆื™ ื”ืคืขืœื” ืฆื‘ืขื•ื ื™ื™ื. ืœื ื”ืคืกื“ ื›ื–ื” ื’ื“ื•ืœ.

ื›ืžื•ื‘ืŸ, ื–ื” ืžื•ื’ื“ืจ ื›ืขืช ื‘-Serlock ืขื‘ื•ืจ ื›ืœ ืžืฉืชืžืฉ.

ืื‘ืœ ืื ืืชื” ืจื•ืฆื” ืœื”ื—ื–ื™ืจ ืืช ื”ืฆื‘ื™ืขื”, ืืชื” ื™ื›ื•ืœ ืคืฉื•ื˜ ืœื—ื–ื•ืจ ืœื”ื’ื“ืจื•ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ:

$ unset LS_COLORS

ืื‘ืœ ืื– ื‘ืกืคืจื™ื•ืช ืขื ื”ืจื‘ื” ืงื‘ืฆื™ื, ื”ืงืคื“ ืœื‘ืฉืœ ืงืคื” ื‘ื–ืžืŸ ืฉื”ื•ื ืคื•ืขืœ ls.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”