Как проверить, что stdin /dev/null из оболочки?

Я понял. Я был близок к DPMS - мне также пришлось отключить заставку xset. Я поместил в свой xinitrc.d следующий сценарий:

#!/bin/bash

xset dpms 0 0 0
xset -dpms
xset s off
setterm -balnk 0
8
26.11.2018, 17:59
3 ответа

В Linux это можно сделать с помощью:

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

В Linux без статистики (1)(например. Busybox на вашем роутере):

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

На *bsd:

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

В таких системах, как *bsd и solaris, /dev/stdin, /dev/fd/0и /proc/PID/fd/0являются не «волшебными» символическими ссылками, как в Linux, а символьными устройствами, которые переключаются на реальный файл при открытии . Стат (2 )на их пути вернет что-то отличное от fstat (2 )на дескрипторе открытого файла.

Это означает, что пример Linux не будет работать там, даже если установлены GNU coreutils. Если версии GNU stat (1 )достаточно свежие, вы можете использовать аргумент -, чтобы он выполнял fstat (2 )для файлового дескриптора 0, точно так же, как stat (. ] 1 )из *bsd:

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

Также очень легко выполнить проверку переносимо на любом языке, который предлагает интерфейс для fstat (2 ), например. вperl:

stdin_is_dev_null(){ perl -e 'exit((stat STDIN)[6]!=(stat "/dev/null")[6])'; }
19
27.01.2020, 20:08

В Linux, чтобы определить, перенаправляется ли стандартный ввод с /dev/null, вы можете проверить, имеет ли /proc/self/fd/0то же устройство и индексный дескриптор, что и/dev/null:

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

Вы можете использовать /dev/stdinвместо /proc/self/fd/0.

Если вы хотите проверить, перенаправляется ли стандартный ввод с нулевого устройства, вам нужно сравнить старший и младший номера устройств, например, используя stat(, см. также ответ mosvy):

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

или, если вас не волнует Linux -специфический ,

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

Переносимо, чтобы проверить, является ли стандартный ввод nullустройством (, открытым на /dev/nullили нет (, как копия /dev/null)), с zsh(, чей statвстроенный до GNU и FreeBSD statкстати (не IRIX'а хотя))):

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

(обратите внимание, что не указано, был ли дескриптор файла открыт только для чтения -, только для записи -или в режиме чтения+записи ).

Чтобы проверить, что он открыт в текущем /dev/nullфайле, в частности (, а не /some/chroot/dev/null, например ), только в Linux (, где /dev/stdinреализован как символическая ссылка на файл, открытый на fd 0 вместо специального устройства, которое при открытии действует как dup(0)в других системах):

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

На не -Linux вы можете попробовать:

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

Теги

Похожие вопросы