РЕДАКТИРОВАТЬ: вы работаете на HP-UX
Протестировано [ -t 0 ]
на HP-UX, и, похоже, оно работает для меня. Я использовал следующую настройку:
/tmp/x.ksh:
#!/bin/ksh
/tmp/y.ksh
/tmp/y.ksh:
#!/bin/ksh
test -t 0 && echo "terminal!"
Бег /tmp/x.ksh
печатает: terminal!
Не могли бы вы подтвердить вышеизложенное на вашей платформе и / или предоставить альтернативную настройку теста, более точно отражающую вашу ситуацию? Ваш сценарий в конечном итоге порожден cron
?
РЕДАКТИРОВАТЬ 2
Если отчаянно и Perl доступен, определите:
stdin_ready() {
TIMEOUT=$1; shift
perl -e '
my $rin = "";
vec($rin,fileno(STDIN),1) = 1;
select($rout=$rin, undef, undef, '$TIMEOUT') < 1 && exit 1;
'
}
stdin_ready 1 || 'stdin not ready in 1 second, assuming terminal'
РЕДАКТИРОВАТЬ 3
Обратите внимание, что время ожидания может быть значительным, если ваш ввод поступает из sort
, ssh
и т. Д. (Все эти программы могут порождать и устанавливать канал с вашим скриптом за секунды или минуты, прежде чем производить какие-либо данные поверх него. ) Кроме того, использование значительного тайм-аута может значительно наказать ваш сценарий, когда на входе нет ничего для начала (например, терминал.)
Если потенциально большие тайм-ауты являются проблемой, и если вы можете повлиять на способ вызова вашего скрипта, то вы можете заставить вызывающих абонентов явно указывать вашей программе, следует ли использовать stdin, через пользовательский параметр или в стандартным способом GNU
или tar
(например, script [options [-]] FILE ..., где FILE может быть именем файла, -
для обозначения стандартного ввода или их комбинации, и ваш скрипт будет читать только из стандартного ввода, если -
передано в качестве параметра.)