私は通常、自動化されたプロセス(cron、Jenkinsなど)で実行されるスクリプトの動作を研究しています。インタラクティブに実行されると、スクリプトは(最終的に)異なる動作をするコマンドを呼び出すことができます(たとえば、リバースパッチでpatch
何をすべきかを尋ね、svn
パスワードを求めますが、次のような場合に何が起こるのかを確認する必要があります)。非対話型で実行されます。
patch
非対話型で説得するのはかなり簡単でした。ただstdout
非ttyにリダイレクトするだけです。
$ </dev/null > >(cat) /path/to/myscript --args
ただしsvn
、存在する場合は制御端末に接続します。渡すスクリプトの編集は--non-interactive
複数のレベルで行われ、各呼び出しが見つかったかどうかはわかりにくいので、実際にはオプションではありません。
制御端末なしでスクリプト/コマンドを非対話式に呼び出す方法はありますか(それで/dev/tty
存在しませんか?)。私はstdout / stderrがまだ私のターミナルに行くことを好みます。
(この質問を見つけました。非対話型シェルでスクリプトを実行しますか?しかし、答えはcronとユーザーエクスペリエンスの違いについて説明します。対話以外のすべての違いを排除しました。 )
答え1
端末に接続されていない別のセッションを開始する必要があります。たとえば、次のようになります。
$ 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
start-stop-daemon
一部のLinuxディストリビューションのコマンドも参照してください。まだ一つあります。daemon
注文する。
答え2
Expectスクリプトを実行したい場合があります。 SVNの例:
https://stackoverflow.com/questions/609445/using-expect-to-login-into-svn
答え3
時には標準入力を開いたままにしておく必要があります(標準入力からeofを受け取らない)(期待)。この場合、/dev/null を /dev/zero に変更します。
setsid sh -c 'make test' </dev/zero >log 2>&1