
我有一個 bash 腳本,/usr/bin/local/myscript。我通常從外部軟體(在我的例子中為 Autohotkey)運行該文件,基本上我的意思是腳本將立即完成並且視窗關閉,因此我看不到視窗上的任何日誌、資訊日誌或錯誤日誌。所以我確實喜歡“編寫”整個運行步驟,以便在程式運行不佳時進行調試。但簡單地將 ascript ~/script.txt
放在文件的第一行myscript
不起作用,我不知道發生了什麼,文件的下一行基本上沒有執行。那麼,是否有一種(正確的)方法在 bash 檔案中使用“腳本”,或者是“腳本”的更好替代方案?
答案1
但簡單地將 a
script ~/script.txt
放在文件的第一行myscript
不起作用,我不知道發生了什麼,文件的下一行基本上沒有執行。
對於 shell 解釋來說myscript
,script ~/script.txt
只是運行外部可執行檔的命令。可執行檔就是script
在這種情況下。
如果執行檔是sleep
, tar
or ls
,您會期望 shell 等到執行檔完成後再解釋myscript
.這沒有script
什麼不同:shell 等待script
完成。
script
旨在用於互動式使用。script ~/script.txt
運行一個互動式 shell,它不是解釋的 shell myscript
。您寫了“視窗關閉”(當沒有 時script
),所以我假設myscript
在某個顯示視窗的終端模擬器中運行。如果是這樣,那麼(使用script
)您可能會看到這個內殼由 啟動script
,並且可以在外殼等待時與其互動。script
記錄您在內殼中所做的事情。退出內殼終止script
,然後外殼(即myscript
)繼續。但也許你關閉了終端模擬器,外殼收到 SIGHUP 並且不再繼續。
這並不重要,因為現在應該清楚,即使外殼繼續運行,script
從內部呼叫myscript
也無法幫助您進行偵錯。myscript
至少有兩種調試方法myscript
:
將腳本的 stderr 重新導向到日誌檔案。這可以在腳本中完成
# just after shebang exec 2>/path/to/logfile
如果
myscript
在其標準輸出上產生輸出,這很重要並且實際上到達某個地方(透過管道或重定向),那麼您不想破壞它。但是,如果它通常列印到終端並且您也想記錄它,則將 stderr 和 stdout 重定向到日誌檔案:# just after shebang exec 2>/path/to/logfile 1>&2
即使在
myscript
沒有終端的情況下運行,此方法也將起作用。或讓腳本
bash
在最後執行互動式 shell(例如 )。新的 shell 將阻止視窗關閉,您將能夠看到腳本到目前為止已列印到終端的內容。這顯然需要一個終端。請注意,如果myscript
發生在exit
或kill
本身或exec
另一個可執行檔上,那麼它永遠不會到達帶有bash
;的行。考慮到這一點。如果由於某種原因從腳本啟動的互動
bash
清除了終端或其他東西,請改用sleep 3600
。關鍵是您實際上並不需要額外的 shell,您需要任何使終端模擬器保持打開足夠長的時間的進程,以便您可以檢查先前的輸出。
無論您選擇哪種方法,都將
set -x
儘早myscript
讓 shell 解釋它並在執行時列印命令和參數。這應該會給您帶來有用的見解。