2015-02-11 30 views
1

如果我使用set -x,那麼這些命令會在執行之前顯示。這樣他們被打印。如何驗證要由shell腳本運行的命令

但我想爲我的腳本有一個調試模式,用戶可以真正看到哪些命令將打印但不會執行。

我也嘗試使用:(空命令)來打印當前命令,但不傳播結果。例如,

find /my/home -name "test*" | while read -r i; 
do 
    rm -f $i 
done 

爲此,預計出放爲:

+find /my/home -name "test" 
+ rm -f test1 
+ rm -f test2 ... 

有什麼辦法,我可以做到這一點,而不必重複代碼(存在明顯的方式有批處理腳本中的2個部分用於調試和正常模式)?

+0

可能重複沒有執行它們](http://stackoverflow.com/questions/19115156/show-commands-without-executing-them) – arco444 2015-02-11 11:22:55

回答

2

你也許可以創建一個包裝函數或者打印即或求你給它的命令:

#!/bin/bash 

run_command() { 
    printf '%q ' "[email protected]" 
    "[email protected]" 
} 

run_command ls -l 
run_command touch /tmp/hello 
run_command rm /tmp/hello 

這樣,你在前面加上run_command到你想要做和評論執行或任何一件事情echo就像你想的那樣。

你也可以提供一個參數,切換要麼echo或執行模式下運行腳本:

debug_mode=$1 
run_command() { 
    if [ "$debug_mode" = true ]; then 
     printf '%q ' "[email protected]" 
    else 
     "[email protected]" 
    fi 
} 

run_command ... 
+2

這不是'eval'既錯誤又危險嗎?我會認爲只是'回聲'$ @「; 「$ @」;'會更接近你想要和期望的。 – tripleee 2015-02-11 15:41:13

+0

哦,你是對的。我知道語法中有些奇怪的東西。修好了,非常感謝! – fedorqui 2015-02-11 15:43:52

+1

'printf'%q'「$ @」; echo'會比'echo'更正確$ @「'這裏 - 'echo'不會顯示'rm'的某個文件」'和「rm」某個「」文件「'之間的區別。 – 2015-02-11 15:50:48

0

最簡單的方式來運行預覽/ DRYRUN:

for f in *; do echo "these files will be removed with rm -f $f"; done 
[show命令
+0

缺少引號意味着這會顯示一些錯誤的文件名。比方說,有人在運行'touch'* .txt''時 - 在遍歷該文件時,這將擴展glob並在該行的當前目錄中顯示_all_文件,而不是顯示文本的* .txt名稱。類似地,一個帶有空格或製表符的名稱會使每個空白字符串被一個空格替換。 – 2015-02-11 15:52:19

+0

@CharlesDuffy很容易修復! – 2015-02-12 11:44:25