2012-01-31 242 views
63

如果我輸入bash -x選項,它將顯示所有行。但腳本將正常執行。如何逐行執行bash腳本?

如何逐行執行?比我可以看到它是否做了正確的事情,或者我放棄並修復錯誤。同樣的效果是在每一行都放一個read

+0

或許更廣泛地還https://stackoverflow.com/questions/951336/how-to-debug-a-bash-script/45096876#45096876 – tripleee 2017-10-02 04:54:05

回答

87

您不需要在everyline中添加讀取,只需將如下陷阱添加到您的bash腳本中,即可獲得您想要的效果,例如。

#!/usr/bin/env bash 
set -x 
trap read debug 

< YOUR CODE HERE > 

工程,只是測試它與bash v4.2.8和v3.2.25。


改進版本

如果你的腳本讀取從文件中的內容,上面列出的將無法正常工作。解決方法可能看起來像下面的示例。

#!/usr/bin/env bash 
echo "Press CTRL+C to proceed." 
trap "pkill -f 'sleep 1h'" INT 
trap "set +x ; sleep 1h ; set -x" DEBUG 

< YOUR CODE HERE > 

阻止你將不得不腳本在這種情況下,另一種外殼殺死它。


ALTERNATIVE1

如果你只是想在你的腳本進行下一個命令下面的例子可以爲你工作之前等待幾秒鐘。

#!/usr/bin/env bash 
trap "set +x; sleep 5; set -x" DEBUG 

< YOUR CODE HERE > 

我添加組+ x和-x設置陷阱指令內,以使輸出的可讀性。

+1

那麼你如何進入下一行(運行下一個命令)? – 2014-03-11 19:52:46

+2

它會在每條命令中捕獲讀取。唯一需要做的就是按return返回到下一個命令 – 2014-03-11 20:10:13

+0

如果你喜歡使用另一個shell,也可以使用ksh。 – ChrisGer 2015-01-28 14:14:00

10

也許BASH Debugger是適合你的東西。

+1

看到這的確是最好的解決方案。它允許在運行之前查看該行(以及更多)。在大多數系統上,它可以使用'apt-get install bashdb'來安裝。然後你只需要運行'bashdb your_command.sh',輸入'step',然後在那之後點擊回車。 – studgeek 2017-01-16 19:35:51

+0

@ studgeek它不可用於Redhat/CentOS等,所以我不會稱之爲「大多數系統」。 – Sajuuk 2018-02-07 08:30:52

0

如果你的bash腳本真的是一堆一個你想逐個運行的命令,你可以做這樣的事情,當你增加一個變量LN時,它會逐個運行每個命令,對應於該行你想運行的號碼。這使您可以再次輕鬆地運行最後一個命令,然後您只需增加變量即可轉到下一個命令。

假設您的命令在文件「it.sh」中,請逐個運行以下命令。

$ cat it.sh 
echo "hi there" 
date 
ls -la /etc/passwd 

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1) 
"hi there" 

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1) 
Wed Feb 28 10:58:52 AST 2018 

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1) 
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd