Bash

Bash:允許在命令參數中使用括號(即防止“意外令牌’(’”)

  • March 31, 2022

我經常使用我提供的命令行程序,該程序帶有包含括號的參數。為簡單起見,假設我在寫

echo 'bar(1,3)'

我想省略引號。但是,如果我這樣做,我會得到syntax errror near unexpected token '('. 我想這與子shell有關。如果這是唯一的方法,我願意禁用這些。(儘管如果 subshel​​l 不在命令的開頭,則無法啟動它,因此據我所知,它們沒有理由禁止在參數中使用括號)

(並且)是語法中的特殊標記字元,bash用於許多運算符,包括:

  • (...)子殼結構
  • func() compound-command函式定義
  • $(...)命令替換
  • <(...),>(...)過程替換
  • ((...))算術評估結構
  • $((...))算術展開
  • a=(...),a+=(...)數組賦值運算符
  • @(...), +(...), *(...), ?(...)glob 運算符(使用 extglob)
  • [[ (a && b) || (c && d) ]]分組條件表達式運算符
  • [[ ... =~ ...(...)... ]]正則表達式運算符。

echo a=(b)是語法錯誤,但不是export a=(b).

echo a)是語法錯誤,除非(在上述結構之一的前幾行中有一個開口。

雖然可以編寫一個 readline 掛鉤,在需要的地方添加引號()以避免語法錯誤,但這將是相當大的努力,因為這意味著對 shell 語法進行完整的解析。

更好的方法可能是在您意識到它包含 shell 特殊字元時為時已晚使用引用目前單詞的快捷方式。

使用zsh(假設emacs模式):

bindkey -s '\e#' '\C@\eb\Cx\Cx\e"'

引用Alt+#目前單詞

或近似值bash(也假設emacs模式):

bind "\"\e#\": \"'\e \eb'\C-X\C-X\""

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