In alcuni Bourne-come gusci, la read
funzione interna non può leggere tutta la linea da file in /proc
(il seguente comando dovrebbe essere eseguito in zsh
, sostituire $=shell
con $shell
con altre 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
lo standard richiede che lo standard input sia un file di testo , tale requisito causa comportamenti diversi?
Leggi la definizione POSIX del file di testo , faccio qualche verifica:
$ 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
Non ci sono NUL
personaggi nel contenuto di /proc/sys/fs/file-max
, e anche find
riportato come un file normale (è presente un bug find
?).
Immagino che la shell abbia fatto qualcosa sotto il cofano, come file
:
$ file /proc/sys/fs/file-max
/proc/sys/fs/file-max: empty
strace
spiegazione basata è molto più facile da capire!