bash 檔案中的 Bash「腳本」指令?

bash 檔案中的 Bash「腳本」指令?

我有一個 bash 腳本,/usr/bin/local/myscript。我通常從外部軟體(在我的例子中為 Autohotkey)運行該文件,基本上我的意思是腳本將立即完成並且視窗關閉,因此我看不到視窗上的任何日誌、資訊日誌或錯誤日誌。所以我確實喜歡“編寫”整個運行步驟,以便在程式運行不佳時進行調試。但簡單地將 ascript ~/script.txt放在文件的第一行myscript不起作用,我不知道發生了什麼,文件的下一行基本上沒有執行。那麼,是否有一種(正確的)方法在 bash 檔案中使用“腳本”,或者是“腳本”的更好替代方案?

答案1

但簡單地將 ascript ~/script.txt放在文件的第一行myscript不起作用,我不知道發生了什麼,文件的下一行基本上沒有執行。

對於 shell 解釋來說myscriptscript ~/script.txt只是運行外部可執行檔的命令。可執行檔就是script在這種情況下。

如果執行檔是sleep, taror 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

  1. 將腳本的 stderr 重新導向到日誌檔案。這可以在腳本中完成

    # just after shebang
    exec 2>/path/to/logfile
    

    如果myscript在其標準輸出上產生輸出,這很重要並且實際上到達某個地方(透過管道或重定向),那麼您不想破壞它。但是,如果它通常列印到終端並且您也想記錄它,則將 stderr 和 stdout 重定向到日誌檔案:

    # just after shebang
    exec 2>/path/to/logfile 1>&2
    

    即使在myscript沒有終端的情況下運行,此方法也將起作用。

  2. 或讓腳本bash在最後執行互動式 shell(例如 )。新的 shell 將阻止視窗關閉,您將能夠看到腳本到目前為止已列印到終端的內容。這顯然需要一個終端。請注意,如果myscript發生在exitkill本身或exec另一個可執行檔上,那麼它永遠不會到達帶有bash;的行。考慮到這一點。

    如果由於某種原因從腳本啟動的互動bash清除了終端或其他東西,請改用sleep 3600。關鍵是您實際上並不需要額外的 shell,您需要任何使終端模擬器保持打開足夠長的時間的進程,以便您可以檢查先前的輸出。

無論您選擇哪種方法,都將

set -x

儘早myscript讓 shell 解釋它並在執行時列印命令和參數。這應該會給您帶來有用的見解。

相關內容