FreeBSD QandA 2016
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 まで
お知らせください。