Dans certains shells de type Bourne, le read
builtin ne peut pas lire toute la ligne à partir du fichier /proc
(la commande ci-dessous doit être exécutée zsh
, remplacez-la $=shell
par $shell
d'autres shells):
$ 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
la norme requiert que l'entrée standard soit un fichier texte , cette exigence provoque-t-elle des comportements variés?
Lisez la définition POSIX du fichier texte , je fais quelques vérifications:
$ 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
Il n'y a aucun NUL
caractère dans le contenu de /proc/sys/fs/file-max
, et l'a également find
signalé en tant que fichier normal (est-ce un bogue dans find
?).
Je suppose que la coquille a fait quelque chose sous le capot, comme file
:
$ file /proc/sys/fs/file-max
/proc/sys/fs/file-max: empty
strace
explication à base est beaucoup plus facile à comprendre!