Terminal

呼叫與控制終端斷開連接的命令/腳本?

  • March 15, 2020

我正在調查通常作為自動化程序執行的腳本的行為(例如 cron、Jenkins)。該腳本可以(最終)在互動執行時呼叫行為不同的命令(尋求使用者輸入);例如,patch會詢問如何處理反向更新檔,並svn詢問密碼,但我需要看看當它們以非互動方式執行時會發生什麼。

說服patch它是非互動式的相當容易;我只需要重定向stdout為非 tty:

$ </dev/null > >(cat) /path/to/myscript --args

但是svn,如果存在,將連接到控制終端;編輯要傳遞的腳本--non-interactive並不是一個真正的選擇,因為這來自幾個層次,而且很難確定我是否找到了每個呼叫。

有沒有辦法在沒有控制終端的情況下以非互動方式呼叫腳本/命令(所以/dev/tty不存在)?我更喜歡 stdout/stderr 仍然去我的終端。

(我發現了Run script in a non interactive shell?這個問題,但該問題的答案討論了 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

另請參閱start-stop-daemon某些 Linux 發行版上的命令。還有一個daemon命令。

你可能想要做一個期望腳本。SVN 範例:

https://stackoverflow.com/questions/609445/using-expect-to-login-into-svn

引用自:https://unix.stackexchange.com/questions/68574