15.2 プログラムが対話的に実行されているかどうか判定する

プログラムが対話的に実行されているかどうか知りたい。例えば、プログラムがシェルから実行されている場合は対話的であり、プログラムがcronから呼び出されている場合は対話的でない。

  • -tを使用してSTDINとSTDOUTをテストする
sub I_am_interactive {
  return -r STDIN && STDOUT;
}
  • POSIXシステムでプログラムを実行している場合は、プロセスグループをテストする
use POSIX qw/getpgrp tcgetpgrp/;

sub I_am_interactive {
  my $tty;
  open($tty, "<", "/dev/tty") or die;
  my $tpgrp = tcgetpgrp(fileno($tty));
  my $pgrp = getpgrp();
  close $tty;
  return ($tpgrp == $pgrp);
}