2014-09-11 25 views
0

我試圖從腳本構建並運行find命令。但我從find得到一個非常神祕的錯誤信息。以下基本概括了我如何構建命令行並運行它-exec arg

$ xx="find . -name 'p*' -mmin +10 -exec echo {} \\;" 
$ echo "$xx" #.....and I get the same print from echo $xx 
find . -name 'p*' -mmin +10 -exec echo {} \; 
$ $xx 
find: missing argument to `-exec' 
$ find . -name 'p*' -mmin +10 -exec echo {} \; 
./p2.sh 
./p1.sh 
$ read xx 
find . -name 'p*' -mmin +2 -exec echo {} \\; 
$ $xx 
find: missing argument to `-exec' 

我被卡住了,並會感謝您的幫助。我也想知道是什麼原因造成的。我在SLES上使用bash 3.2.51。

我想要執行的實際命令有點長,但我在這裏用echo來說明。

感謝 迪內希

回答

3

嘗試存儲在bash變量複雜的命令,然後計算變量相當不錯永遠不會奏效。

如果您需要分段構建命令,請使用數組。看到這個有用的Bash常見問題解答:I'm trying to put a command in a variable, but the complex cases always fail!

這裏的基本策略:

# Make an array 
declare -a findcmd=(find .) 
# Add some arguments 
findcmd+=(-name 'p*') 
findcmd+=(-mmin +10) 
findcmd+=(-exec echo {} \;) 
# Run the command 
"${findcmd[@]}" 

您需要了解的bash引用作品。請記住,當您鍵入命令時(或者bash從腳本文件讀取它時),引用(和除引號)只會發生一次。進入變量值的引號只是普通的字符。

如果您正在試驗set -x,請記住set -x插入引號以消除歧義。這些引用不是變量的一部分。雖然這顯然是必不可少的,但對於不熟悉bash執行模型的程序員來說,這似乎令人困惑。

+0

謝謝。應該有一個額外的+1來清晰解釋! – Dinesh 2014-09-11 05:43:43