Shell

為另一個命令包裝一個包含單引號和雙引號的命令

  • November 9, 2018

我最近了解了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"'

(甚至更多引用!)其他地方。

引用自:https://unix.stackexchange.com/questions/23347