Я понял. Я был близок к DPMS - мне также пришлось отключить заставку xset. Я поместил в свой xinitrc.d следующий сценарий:
#!/bin/bash
xset dpms 0 0 0
xset -dpms
xset s off
setterm -balnk 0
В 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])'; }
В 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
Переносимо, чтобы проверить, является ли стандартный ввод 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