Zshは変数値に引用符を追加できます(ただし、これはbashでも機能します)。

Zshは変数値に引用符を追加できます(ただし、これはbashでも機能します)。

私はzshに最初に触れました(昨日bashから移行しました)。

bashにはbash機能があります。

vl() { cmd=`echo $1 | sed -r 's/(.+):([0-9]+).+/\1 +\2/g'`; vim $cmd }

これはデフォルトで次のパラメータを変換します。

vl ./manifests/production/test.pp:387:foobar  # A output of $grep -iHn test 

到着

vim ./manifests/production/test.pp +387   #Aim is to open file at line-number 387

zshの同じ機能が期待どおりに機能しません。追加された名前のファイルを./manifests/production/test.pp +387開く代わりに、vimで名前付きファイルを開きます。に引用符を追加するようです。./manifests/production/test.pp+387$cmd

誰かがここで何が起こっているのかを説明できればいいでしょう。ありがとう

ベストアンサー1

Bourneシェル、ダッシュ、ksh、bashなどの一般的なBourneスタイルのシェルでは、構文は$variable「変数の値を取得し、IFSその文字が現れる別の単語に分割し、各単語をファイル名ワイルドカードとして扱うことを意味します。使用して、複数のファイルのいずれかと一致する場合は拡張してください。配列の場合、variable配列の最初の要素で発生し、他の要素は無視されます。

zshでは、構文は$variable「変数の値を取得し、空の場合は削除」を意味します。variable配列の場合、これは配列のすべての要素に対して発生します。 Zsh愛好家は、zshの方が優れていると思います。

$=variablezshでは、単語の分離を実行するように書くことができます。ただし、これは現在実行中のタスクを実行する最良の方法ではありません。 bash関数はファイル名のスペースを処理せず、$=variablezshでもスペースを使用しません。これは引数を解析する別の方法で、bashとzshの両方で機能し、:ファイル名を除くすべての文字を処理できます。引数に2つのコロンが含まれている場合、最初のコロンの後のすべての内容は削除され、最初のコロンと2番目のコロンの間の部分はシンボルの前に別の引数として追加されます+。コードより少し長いが、理解するのは難しくなく、ファイル名の最初の空白のヒントのために詰まらない。

vl () {
  local suffix
  case $1 in
    *:*:*) suffix=${1#*:};; set -- "${1%%:*}" "+${suffix%%:*}";;
  esac
  vim "$@"
}

おすすめ記事