通常は自動化されたプロセスとして実行されるスクリプト(cron、Jenkinsなど)の動作を調査しています。スクリプトは、対話的に実行すると(最終的に)動作が異なる(ユーザー入力を求める)コマンドを呼び出すことができます。たとえば、patch
はリバースパッチの処理方法を尋ね、svn
はパスワードを要求しますが、非対話的に実行するとどうなるかを確認する必要があります。
非インタラクティブであることをpatch
に説得するのはかなり簡単です。 stdout
を非ttyにリダイレクトするだけです:
$ </dev/null > >(cat) /path/to/myscript --args
ただし、svn
は、存在する場合は制御端末に接続します。 --non-interactive
を渡すようにスクリプトを編集することは、実際にはオプションではありません。これは、いくつかのレベルの深さから来ており、すべての呼び出しで確実に見つけることが難しいためです。
(/dev/tty
が存在しないように)制御端末なしで、非対話的にスクリプト/コマンドを呼び出す方法はありますか?私はまだ私の端末に行くよりstdout/stderrを好みます。
(私は質問 非対話型シェルでスクリプトを実行しますか? を見つけましたが、その答えはcronとユーザー環境の違いについて説明しています。非対話型以外のすべての違いはすでに排除しています。)
端末に接続されていない別のセッションを開始する必要があるため、たとえば次のようにします。
$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
PID PGID SID TTY TIME CMD
19506 19506 19506 ? 00:00:00 sh
test
一部のLinuxディストリビューションにあるstart-stop-daemon
コマンドも参照してください。 daemon
コマンドもあります。
Stdinを開いたままにする必要がある場合があります(stdinでeofを受信しない)(たとえば、expect)。その場合は、/ dev/nullを/ dev/zeroに変更します。
setsid sh -c 'make test' </dev/zero >log 2>&1