GNU/Linux >> Linux Esercitazione >  >> Linux

Come verificare se stdin è /dev/null dalla shell?

Su Linux, puoi farlo con:

stdin_is_dev_null(){ test "`stat -Lc %t:%T /dev/stdin`" = "`stat -Lc %t:%T /dev/null`"; }

Su un Linux senza stat(1) (es. busybox sul tuo router):

stdin_is_dev_null(){ ls -Ll /proc/self/fd/0 | grep -q ' 1,  *3 '; }

Su *bsd:

stdin_is_dev_null(){ test "`stat -f %Z`" = "`stat -Lf %Z /dev/null`"; }

Su sistemi come *bsd e solaris, /dev/stdin , /dev/fd/0 e /proc/PID/fd/0 non sono collegamenti simbolici "magici" come su Linux, ma dispositivi a caratteri che passeranno al file reale quando vengono aperti . Uno stat(2) sul loro percorso restituirà qualcosa di diverso da un fstat(2) sul descrittore di file aperto.

Ciò significa che l'esempio di Linux non funzionerà lì, anche con GNU coreutils installato. Se la versione di GNU stat(1) è abbastanza recente, puoi usare - argomento per fargli fare un fstat(2) sul descrittore di file 0, proprio come stat(1) da *bsd:

stdin_is_dev_null(){ test "`stat -Lc %t:%T -`" = "`stat -Lc %t:%T /dev/null`"; }

È anche molto semplice eseguire il controllo in modo portatile in qualsiasi linguaggio che offra un'interfaccia a fstat(2), ad es. in perl :

stdin_is_dev_null(){ perl -e 'exit((stat STDIN)[6]!=(stat "/dev/null")[6])'; }

Su Linux, per determinare se l'input standard viene reindirizzato da /dev/null , puoi controllare se /proc/self/fd/0 ha lo stesso dispositivo e inode di /dev/null :

if [ /proc/self/fd/0 -ef /dev/null ]; then echo yes; else echo no; fi

Puoi usare /dev/stdin invece di /proc/self/fd/0 .

Se vuoi verificare se l'input standard viene reindirizzato dal dispositivo nullo, devi confrontare i numeri del dispositivo principale e secondario, ad esempio utilizzando stat (vedi anche la risposta di mosvy):

if [ "$(stat -Lc %t:%T /dev/stdin)" = "$(stat -Lc %t:%T /dev/null)" ]; then echo yes; else echo no; fi

oppure, se non ti interessa che sia specifico per Linux,

if [ "$(stat -Lc %t:%T /dev/stdin)" = "1:3" ]; then echo yes; else echo no; fi

Portably, per verificare che stdin sia null dispositivo (aperto su /dev/null o meno (come una copia di /dev/null )), con zsh (il cui stat builtin precede sia GNU che FreeBSD stat a proposito (non IRIX' però))):

zmodload zsh/stat
if [ "$(stat +rdev -f 0)" = "$(stat +rdev /dev/null)" ]; then
  echo stdin is open on the null device
fi

(nota che non dice se il descrittore di file era aperto in modalità sola lettura, sola scrittura o lettura+scrittura).

Per verificare che sia aperto sull'attuale /dev/null file specifico (non /some/chroot/dev/null per esempio), solo su Linux (dove /dev/stdin è implementato come collegamento simbolico al file aperto su fd 0 invece di un dispositivo speciale che quando aperto si comporta come un dup(0) in altri sistemi):

if [ /dev/stdin -ef /dev/null ]; then
  echo stdin is open on /dev/null
fi

Su non Linux, puoi provare:

if sh -c 'lsof -tad0 -p"$$" /dev/null' > /dev/null 2>&-; then
  echo stdin is open on /dev/null
fi

Linux
  1. Come mappare il dispositivo /dev/sdX e /dev/mapper/mpathY dal dispositivo /dev/dm-Z

  2. Come codificare in base64 /dev/random o /dev/urandom?

  3. Come eseguire il file sh da un altro file sh

  4. screen Impossibile aprire il tuo terminale '/dev/pts/0' - controlla

  5. Come creare /dev/null?

Come reindirizzare l'output su /dev/null in Linux

Come reindirizzare l'output di un'applicazione in background a /dev/null

Come verificare se esiste un comando shell da PHP

Come eseguire il comando Vim dalla shell?

DD da /dev/zero a /dev/null... cosa succede realmente

Linux:differenza tra /dev/console , /dev/tty e /dev/tty0