ZSH、着信パラメータを単一の文字列に連結する

ZSH、着信パラメータを単一の文字列に連結する

使いやすいようにシンプルなbash機能を作りたいです。以下の回答に従ってください。bash引数をスペースを含む単一の文字列に連結します。私は次のような小さなコードを1つにまとめることができました。

function gcm {
  msg="'$*'"
  eval "git commit -m ${msg}"
}

この例は、「Hello、it's me」(簡単な単語文字セット)などのコミットメッセージには非常に便利ですが、「[WIP] Halfway trough code」などのコミットメッセージが必要ない場合は、次のエラーメッセージが表示されます。次のようになります。 zsh: no matches found: [WIP]

後で何が起こっているのか、そしてこのコードスニペットが失敗する理由を説明してください。

ベストアンサー1

ZSHには他のシェルで見られるトークン化の動作がないので(SH_WORD_SPLITそのオプションが奇妙な理由でオンになっていない限り)、奇妙な二重引用符構造を使用する必要はありません。

% (){ print -l $* } a b c  
a
b
c
% (){ print -l "$*" } a b c
a b c
% (){ local msg; msg="$*"; print -l $msg } a b c
a b c
% 

したがって、次のもので十分です。

function gcm {
  local msg
  msg="$*"
  git commit -m $msg
}

[WIP]文字列(asなど'[WIP]')を引用するか、エイリアスを使用してワイルドカードを無効にすることができますnoglob

% function blah { print -l "$*" }
% alias blah='noglob blah'
% blah [de] *blah*
[de] *blah*
% 

おすすめ記事