Shell
為另一個命令包裝一個包含單引號和雙引號的命令
我最近了解了watch,但是在使用相對複雜的命令時遇到了麻煩。
例如,我想要求每三秒
watch
執行一次以下命令*:zsh
for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done
如您所見,上面的行包括單引號、雙引號以及其他特殊字元。
所以我嘗試了:
watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"
但後來我得到了:
在 !@#$# …. 中找不到 x 的匹配項;完畢
我嘗試了其他組合但沒有成功。這是其中的一種嘗試:
watch -n 3 "for x in $(bjobs -w | grep pre_seg | cut -d' ' -f1); do bmod -R "rusage[mem=7000]" $x; done"
這也會導致類似的錯誤。
任何想法如何使這項工作?
*我也會對適用的解決方案感興趣
bash
一般提示:如果您有兩層嵌套,請避免在內部命令中使用單引號,並在外部命令周圍使用單引號。
附加提示:不要使用反引號 -
…
- 來執行程式碼,而是使用$(…)
它。當涉及到嵌套引號時,美元括號幾乎是 DWIM(‘Do what I mean’);反引號具有神秘的、依賴於 shell 的規則。watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
如果在單引號命令中需要單引號,可以使用
'\''
. 將這四個字元視為在單引號內引用單引號的方式,儘管從技術上講,這被構造為結束單引號字元串,附加文字單引號,並開始一個新的單引號字元串(仍然附加到目前單詞)。對於更複雜的情況,要麼煞費苦心地計算引號,要麼定義臨時變數。
cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done' watch_cmd='watch -n 3 "$cmd"'
這個答案並不特定於 zsh。Zsh 在這裡沒有帶來任何重大的東西。您可以節省一些引用,因為在命令替換周圍不需要雙引號,有時有一些方法可以使用內置命令而不是外部命令來減少引用需求,但基本問題與其他 shell 相同。
哦,順便說一句,請注意,
watch
它將在 中執行您的命令sh
,而不是在 zsh 中。如果要在zsh中執行命令,需要執行watch -n 3 -x zsh -c "$cmd"
在 Debian/Ubuntu 上,以及
export cmd watch -n 3 'exec zsh -c "$cmd"'
(甚至更多引用!)其他地方。