Как проверить, работает ли Perl-скрипт в терминале?
Я пытаюсь определить, в скрипте Perl в Linux, работает ли он в терминале.
то есть мне нужен код, что:
- возвращает true при простом запуске в командной строке
- также возвращает true при запуске
./myscript.pl | less
или даже./myscript.pl </dev/null >/dev/null 2>/dev/null
- возвращает false при выполнении задания cron или в виде скрипта CGI
особенно из-за второй пули, я не могу использовать -t STDOUT
и вариации, и также IO:: Interactive бесполезно.
информация, похоже, доступна. Если я побегу ps
, он показывает запись, как pts/2
на
5 ответов
вы можете попробовать открыть /dev / tty. Это будет работать, если вы находитесь в терминале (даже в терминале на удаленном компьютере). В противном случае, если скрипт запускается через AT или cron, он не будет.
Примечание: это будет работать только на системах Unix.
еще один ответ на мой собственный вопрос. Я изучал ps
источник, чтобы увидеть, как он определил TTY, и он использует /proc/[pid]/stat
.
use strict;
use warnings;
use 5.010;
use autodie;
sub isatty()
{
# See http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html
open(my $stat, '<', "/proc/$$/stat");
if (<$stat> =~ m{^\d+\s+\(.*\)\s+\w\s+\d+\s+\d+\s+\d+\s+(\d+)}) {
return > 0;
}
else {
die "Unexpected format in /proc/$$/stat";
}
}
чтобы частично ответить на мой собственный вопрос, следующее делает трюк:
sub isatty()
{
my $tty = `/bin/ps -p $$ -o tty --no-headers`;
$tty =~ s{[\s?]}{}g;
return $tty;
}
возвращает имя TTY, если таковое имеется (что равно true), или"", если нет (false).
Я все равно предпочел бы решение без внешней команды...
сначала вы должны проверить, выход связан с терминалом by-t . Конечно, если вы хотите, вы можете посмотреть /proc/$pid/fd / 1 , это символическая ссылка на устройство. Вы можете проверить его, если это терминал.
но если это не достаточно, вы можете проверить переменные enviromential на %ОКР специальной хэш-таблице. Интерфейс CGI-BIN устанавливает некоторые из них. Если вы запускаете скрипт под cron, он устанавливает некоторую переменную. Если этого недостаточно, вы можете установить его в файле /etc/crontab и протестировать в своем скрипте. Это для ваших нужд что ты сделаешь.
вы должны вызвать эту полную процедуру только один раз. Вы не можете повторить его, потому что среда скрипта не изменится, пока она не будет работать.
вам не нужно вызывать какие-либо внешние команды, или вам не нужен специальный libarier. Только то, что вам нужно, это несовместимость windows. Но если вы используете windows10, то у него есть среда, подобная linux на основе ubuntu. тогда вы не можете смотреть так сильно, как вы это делаете, делая совместимость между win32api и unix как системы.