while - shell指令




在shell腳本中:echo shell命令執行時 (10)

shuckc對回顯選擇行的回答有一些缺點:最終會出現以下set +x命令,並且你失去了使用$?測試退出代碼的能力$? 因為它被set +x覆蓋。

另一種選擇是在子shell中運行命令:

echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )

if [ $? -eq 0 ] ; then
    echo "curl failed"
    exit 1
fi

這會給你如下輸出:

getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed

不過,這確實會導致為命令創建新的子shell的開銷。

在shell腳本中,我如何回顯所有調用的shell命令並展開所有變量名稱? 例如,給出以下行:

ls $DIRNAME

我希望腳本運行該命令並顯示以下內容

ls /full/path/to/some/dir

目的是保存所有調用的shell命令及其參數的日誌。 也許有更好的方法來生成這樣的日誌?


set -xset -o xtrace擴展變量並在行之前打印一點+符號。

set -vset -o verbose在打印之前不會展開變量。

使用set +xset +v關閉上述設置。

在腳本的第一行中,可以在腳本中稍後將#!/bin/sh -x (或-v )與set -x (或-vset -x為相同的效果。

以上也適用於/bin/sh

http://www.faqs.org/docs/abs/HTML/options.html

$ cat shl
#!/bin/bash                                                                     

DIR=/tmp/so
ls $DIR

$ bash -x shl 
+ DIR=/tmp/so
+ ls /tmp/so
$

上面發布的人:

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

這看起來很有希望,但我不能為了我的生活找出它的作用。 我已經在man bash頁面中搜索了“\ $”和“$ @”,並且找不到任何東西

我明白正在創建一個名為“exec()”的函數。 我明白花括號標記了函數的開始和結束。 我認為我明白分號標誌著多行命令之間的“硬回歸”,因此'{echo'\ $ $ @“; “$ @”; 本質上:

{
echo "\$ [email protected]"
"[email protected]"

}

任何人都可以給我一個簡短的解釋,或者在哪裡可以找到這個信息,因為顯然我的google-fu讓我失望了?

(沒有意義在一個舊的線程上開始一個新的問題,我的目標是將輸出重新路由到一個文件,“set -x; [commands]; set + x”方法對我來說非常適合,但我可以'弄清楚如何將結果回顯到一個文件而不是屏幕上,所以我想了解另一種方法,希望我能夠很好地理解重定向/管道/ tee /等等,來做同樣的事情。)

謝謝!

後期編輯:

隨著一些修補,我相信我明白了。 這是我需要的等價代碼:

SCRIPT_LOG="\home\buddy\logfile.txt"
exe () {
  params="[email protected]"                       # Put all of the command-line into "params"
  printf "%s\t$params" "$(date)" >> "$SCRIPT_LOG"   # Print the command to the log file
  $params                           # Execute the command
}

exe rm -rf /Library/LaunchAgents/offendingfile
exe rm -rf /Library/LaunchAgents/secondoffendingfile

logfile.txt中的結果如下所示:

Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/offendingfile
Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/secondoffendingfile

正是我需要的。 謝謝!


你也可以在你的腳本中通過將它們包裝在set -xset +x來切換這些行

#!/bin/bash
...
if [[ ! -e $OUT_FILE ]];
then
   echo "grabbing $URL"
   set -x
   curl --fail --noproxy $SERV -s -S $URL -o $OUT_FILE
   set +x
fi

在命令行上輸入“bash -x”,然後輸入bash腳本的名稱。 例如,要執行foo.sh,請輸入:

bash -x foo.sh

對於cshtcsh ,可以set verboseset echo (或者甚至可以設置兩者,但大部分時間可能會導致重複)。

verbose選項幾乎打印出您輸入的確切shell表達式。

echo選項更能反映產卵過程中執行的內容。

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo

Special shell variables

verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.

echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.


您可以使用-x選項以調試模式執行 bash腳本。
這將回應所有的命令。

bash -x example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt


您還可以在腳本中保存-x選項 。 只需在shebang中指定-x選項即可。

######## example_script.sh ###################
#!/bin/bash -x

cd /home/user
mv text.txt mytext.txt

##############################################

./example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt




我使用一個函數來回顯然後運行命令

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

exe echo hello world

哪些產出

$ echo hello world
hello world

編輯:

對於更複雜的命令管道等,你可以使用eval:

#!/bin/bash
#function to display commands
exe() { echo "\$ ${@/eval/}" ; "[email protected]" ; }

exe eval "echo 'Hello World' | cut -d ' ' -f1"

哪些產出

$  echo 'Hello World' | cut -d ' ' -f1
Hello

為了允許複合命令被回顯,我使用eval和Soth的exe函數來回顯然後運行命令。 這對管道命令非常有用,否則這些命令只會顯示任何內容或僅顯示管道命令的初始部分。

沒有評估:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe ls -F | grep *.txt

輸出:

$
file.txt

用eval:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe eval 'ls -F | grep *.txt'

哪些產出

$ exe eval 'ls -F | grep *.txt'
file.txt

$ cat exampleScript.sh
#!/bin/bash
name="karthik";
echo $name;

bash -x exampleScript.sh

輸出如下:





shell