Bash:コマンド引数に括弧を付けることができます(例:「偶然のトークン」(「」)を防ぐ)

Bash:コマンド引数に括弧を付けることができます(例:「偶然のトークン」(「」)を防ぐ)

私はしばしば私が提供する引数に括弧を含むコマンドラインプログラムを使用します。簡単に言えば、私が書いているとしましょう。

echo 'bar(1,3)'

引用符を省略したい。しかし、これはsyntax errror near unexpected token '('サブシェルに関連しているようです。それが唯一の方法なら、喜んで無効にします。 (コマンドの先頭でないとサブシェルを起動できませんが、私が知っている限り引数で括弧を受け入れない理由はありません。)

答え1

(以下を含む多くの演算子で使用される)構文の特殊表示文字です。bash

  • (...)サブシェル構造
  • func() compound-command機能定義
  • $(...)コマンドの置き換え
  • <(...)>(...)プロセスの置き換え
  • ((...))算術評価構造
  • $((...))算術拡張
  • a=(...)a+=(...)配列割り当て演算子
  • @(...)、、、、glob演算子(extglobを使用+(...)*(...)?(...)
  • [[ (a && b) || (c && d) ]]グループ条件式演算子
  • [[ ... =~ ...(...)... ]]正規表現演算子。

echo a=(b)文法エラーですが、そうではありませんexport a=(b)

echo a)(上記のいずれかの構文の最初の数行にスペースがない場合は、構文エラーです。

(構文エラーを回避するために必要な場所に引用符を追加するreadlineフックを作成することは可能ですが、)これはシェル構文の完全な解析を意味するため、かなりの労力が必要です。

現在の単語にシェル固有の文字が含まれているという事実があまりにも遅くわかっている場合は、現在の単語を参照するショートカットを使用する方が良い方法です。

AND zshemacsパターン仮定):

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

Alt+#現在を参照してください言葉

またはおおよそのbash(モードを想定してemacs):

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

答え2

これはおそらく悪い考えです(注釈を参照)。しかし、同じ問題があり、使用する前に合計[に変更される関数を作成して解決しました。(])

echo2() {
    expression=$(echo $@ | tr '[]' '()')
    echo "$expression"
}

入力する:

echo2 bar[1,3]

結果:

bar(1,3)

[]がシェルによって特別に処理されるかどうかはわかりません。ただし、(機能の代わりにそれを使用したい場合は、)おそらくこれが解決策かもしれません。

関連情報