FreeBSD QandA 2016

FreeBSD QandA

Q. csh スクリプトで書いたプログラムを cron で実行するようにしたところ、
   スクリプト中で stty を使っていないのに、
       stty: stdin isn't a terminal
   というメッセージを含んだメールが実行ユーザ宛に送付されるのですが、
   どうすれば回避できますか。

A. そもそも、csh スクリプトを書くべきではありません。
   たとえ、tcsh(1) がそう主張していようとも、です (cf. [管理番号 1551])。
   それはそれとして、もしもあなたが
   ・csh の builtin コマンドを使用しなければならない等、あえて csh スクリ
     プトにする理由がある
   ・356行くらいある csh スクリプトを、あと 7分で修正して動かさなければな
     らない
   ・宗教上の理由またはおばあちゃんの遺言で csh でスクリプトを書かなけれ
     ばならない
   のであれば、以下を確認してみて下さい。

   csh(1) の「スタートアップとシャットダウン」の節に述べられている通り、
   スクリプトからは呼んでいないはずの stty が実行されてしまうのは、
   /etc/csh.cshrc や実行ユーザーの .cshrc (または .cshrc) で stty が呼ば
   れている為でしょう。

   /etc/csh.cshrc や .cshrc で行なわれる設定を利用する必要がないのであれ
   ば、そのスクリプトの冒頭は
       #! /bin/csh -f
   として、上記設定ファイルを読み込まないようにすべきです。

   一方、非対話的なシェルでは端末の操作を行なう必要はありませんので、
   そういう操作を行なう stty のようなコマンドは
     if ($?prompt) then
     endif
   で括って、非対話的なシェルでは実行されないようにして、非対話的なシェル
   から読み込まれた場合も問題が起きないようにしましょう。

間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。