我试图在Linux上的Perl脚本中确定它是否在终端中运行.
也就是说,我需要以下代码:
./myscript.pl | less甚至还会返回true./myscript.pl </dev/null >/dev/null 2>/dev/null特别是因为第二个子弹,我不能使用-t STDOUT和变化,IO :: Interactive也没用.
信息似乎确实可用.如果我运行ps,它显示的条目类似pts/2的TTY专栏,甚至当我运行./myscript.pl </dev/null >/dev/null 2>/dev/null,并?作为cron作业或CGI脚本运行的时候.
有没有一种优雅的方法来在Perl脚本中确定这个?我宁愿不必解析输出ps.
Ing*_*ngo 12
您可以尝试打开/ 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";
    }
}
| 归档时间: | 
 | 
| 查看次数: | 9699 次 | 
| 最近记录: |