[英]How do I check if a Perl script is running in a terminal?
我試圖在Linux上的Perl腳本中確定它是否在終端中運行。
也就是說,我需要以下代碼:
./myscript.pl | less
時也返回true ./myscript.pl | less
甚至./myscript.pl </dev/null >/dev/null 2>/dev/null
特別是因為第二個子彈,我不能使用-t STDOUT
和變體,而且IO :: Interactive也沒用。
信息似乎確實可用。 如果我運行ps
,它會在TTY
列中顯示類似pts/2
的條目,即使我運行./myscript.pl </dev/null >/dev/null 2>/dev/null
,和?
作為cron作業或CGI腳本運行時。
有沒有一種優雅的方法來在Perl腳本中確定這個? 我寧願不必解析ps
的輸出。
您可以嘗試打開/ 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 $1 > 0;
}
else {
die "Unexpected format in /proc/$$/stat";
}
}
PS應該幫助你。
ps aux | grep 'filename.pl'
首先你必須檢查,輸出與-t相關聯。 當然如果你想,你可以查看/ proc / $ pid / fd / 1,它是設備的符號鏈接。 如果它是終端,你可以測試它。
但是如果還不夠,你可以通過%ENV特殊哈希表檢查環境變量。 CGI-BIN接口設置了其中一些。 如果你在cron下運行腳本,它會設置一些變量。 如果還不夠,可以在/ etc / crontab文件中設置它並在腳本中進行測試。 這是你的需要,你會做什么。
您應該只調用一次完整的過程。 你不能迭代它,因為腳本環境不會改變,直到它工作。
您不必調用任何外部命令,或者您不需要特殊的libarier。 只有你需要的是Windows不兼容。 但是如果你使用的是windows10,那么它的環境類似於基於ubuntu的linux。 然后你不能強烈地看,因為你在win32api和unix之類的系統之間做兼容。
為了部分回答我自己的問題,以下是訣竅:
sub isatty()
{
my $tty = `/bin/ps -p $$ -o tty --no-headers`;
$tty =~ s{[\s?]}{}g;
return $tty;
}
返回TTY名稱(如果有)(如果為true),或者如果沒有則返回(false)。
我還是更喜歡沒有外部命令的解決方案......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.