在某些类似Bourne的shell中,read
内置/proc
命令无法从file in读取整行(以下命令应在in中运行zsh
,$=shell
并$shell
用其他shell 替换):
$ for shell in bash dash ksh mksh yash zsh schily-sh heirloom-sh "busybox sh"; do
printf '[%s]\n' "$shell"
$=shell -c 'IFS= read x </proc/sys/fs/file-max; echo "$x"'
done
[bash]
602160
[dash]
6
[ksh]
602160
[mksh]
6
[yash]
6
[zsh]
6
[schily-sh]
602160
[heirloom-sh]
602160
[busybox sh]
6
read
标准要求标准输入需要是一个文本文件,该要求是否引起各种行为?
阅读文本文件的POSIX定义,我进行一些验证:
$ od -t a </proc/sys/fs/file-max
0000000 6 0 2 1 6 0 nl
0000007
$ find /proc/sys/fs -type f -name 'file-max'
/proc/sys/fs/file-max
的NUL
内容中没有字符/proc/sys/fs/file-max
,并且也将其find
报告为常规文件(这是bug find
吗?)。
我猜壳在幕后做了些什么,例如file
:
$ file /proc/sys/fs/file-max
/proc/sys/fs/file-max: empty
strace
基于解释的解释更容易理解!