コマンド出力を配列に送信するときにスラッシュをエスケープします。

コマンド出力を配列に送信するときにスラッシュをエスケープします。

git branch -r現在のプロジェクトでは、次のように出力をzshの配列にインポートしようとしています。

% all_branches = ("${(@f)$(git branch -r)}")

ただし、このコマンドを実行すると、端末に次のエラーメッセージが表示されます。

zsh: bad pattern: (  origin/Backplane-Broken-Links

zshの分岐名にスラッシュがある問題があると推論します。 gitの出力を私の配列に送信するときにスラッシュ(および他の特殊文字がある場合は別の特殊文字)を処理する方法はありますか?

ベストアンサー1

(で借用したzshように)の配列割り当て構文は次のとおりです。bashzsh

array=( value1 value2
 value3...)

両側にスペースを含めることはできません(ただし、配列のメンバーを構成する単語だけでなく、通常どおりに単語を区切るために使用される=スペース、タブ、または改行文字も内部にあります)。(...)

だからあなたは以下が欲しい:

all_branches=("${(@f)$(git branch -r)}")

または:

all_branches=( "${(@f)$(git branch -r)}" )

または:

all_branches=(
  "${(@f)$(git branch -r)}"
)

どのスタイルが好きかによって異なります。

all_branches=(${(f)"$(git branch -r)"})

動作します。空の要素を維持するには、"..."拡張全体をフラグと組み合わせます。@gitブランチ名は空にできないと思いますが、とにかく$(...)削除されることに注意してください。みんな末尾の改行なので、空の分岐が出力の終わりにある場合はとにかく削除されます。ただし、分割を$(...)防ぐには依然として参照が必要です。$IFS

ちなみに、これはarray = ()and 関数定義の始まりです:array=

$ array = ()
function> echo test
$ array
test
$ =
test

しかし:

array = (foo|bar)

コマンドが見つかると、globパターン(存在する場合)と一致するファイルを引数として使用して実行されますarray=(foo|bar)

しかし、ここでは("${(@f)$(git branch -r)}")有効なグローバルパターンを形成しません。削減

完全性のために、

array = ( value1 value2 )

シェルrc(Research Unix V10 および plan9 シェル) で有効な構文です。このシェルではこれを実行できず、echo =構文エラーが発生します。見積もりが必要です=

おすすめ記事