「$_」の拡張されていないバージョンは何ですか?

「$_」の拡張されていないバージョンは何ですか?

bash / zshは後で使用するために前のコマンドを表す最後の引数を使用しますが、この引数には$_ドキュメントの「拡張バージョン」が含まれています。拡張されていないバージョンを持つことができるものはありますか?次の例のようになります。

printf "%s\n" something{1..3}

something{1..3}さらに、後続のコマンドで拡張されていないパラメータにアクセスしたいと思います。something3

これを行うと、まだ誰もではなく最後の引数にのみ追加されます。

bash -c '
   printf "%s\n" "$@" && printf "%s\n" "$@"-add-something-more;
' _ something{1..3}

繰り返しますがzsh、トリックなしでこれを達成する方法はありますかeval?私はこの方法を使用するのが好きではありませんが、正確に私が何をしたいのかを見せたいですか?

bash -c '
    eval printf "%s\\\n" "$@" && eval printf "%s\\\n" "$@"-add-something-more;
' _ 'something{1..3}'
something1
something2
something3
something1-add-something-more
something2-add-something-more
something3-add-something-more

メモ:

  • コマンドはスクリプト内で実行され、パラメーターはユーザーによってスクリプトに渡されるため、履歴から読み取るのはオプションではありません。
  • 私は成功した場合にのみ実行するために構文を使用しますcommand1 "$@" && command2 "$@"<question-part>command2command1

答え1

パラメータリストを複数回再利用するには、通常これは(匿名)関数または変数の目的です。

存在するzsh

() {cmd1 "$@" && cmd2 "$@"} something{1..3}
l=(something{1..3}); cmd1 $l && cmd2 $l

各パラメータに同じ文字列を追加するには、次の$^array構文を使用します。

$ () {echo $@; echo $^@-more} a{1..3}
a1 a2 a3
a1-more a2-more a3-more

bash//kshこれにzsh対応するのは)です"${@/%/-more}"

拡張されていないバージョンを取得するには$_:

TRAPDEBUG() last_cmd=($cur_cmd) cur_cmd=("${(z)ZSH_DEBUG_CMD}") 

それから:

$ echo a{1..3}; echo $last_cmd[-1]
a1 a2 a3
a{1..3}

DEBUGただし、トラップが実行されることに注意してください。今後サブリスト、いいえ管路、言及する必要がない注文する。だからこれはうまくいきませんecho a{1..3} && echo $last_cmd[-1]。以下を行う必要があります。

$ eval 'echo a{1..3}' && eval 'echo $last_cmd[-1]'
a1 a2 a3
a{1..3}

関連情報