zshの(N)モードを使用するためにbashを有効にする方法は?

zshの(N)モードを使用するためにbashを有効にする方法は?

私はzshとBashで実行されるスクリプトを開発しようとしています(理想的には同じことをします:-)。問題は、ある時点でzshの特定の部分に(N)。だから:this_pattern*(N)。 zshでは、一致するものがない場合、パターンは空になります。

Bashは、これについて「予期しない記号が原因で構文エラーが発生する」と言います。 Bashでの実行はzshの特定の部分では決して起こらず、このエラーメッセージは解析コードによって引き起こされます!

解析しないなどの方法でBashがこれを食べるのに役立ちますか?

答え1

からzsh_expn

  N      sets the NULL_GLOB option for the current pattern

したがって、bashメソッドはnullglobそのモードのオプションを設定することです。

( shopt -s nullglob || setopt NULL_GLOB && yourcommand this_pattern* )

によって生成されたサブシェルに対してのみこのオプションを設定して機能します(…)。 (それぞれbashとzsh組み込みでshopt失敗setoptまたは失敗しますが、有効な設定オプションを使用すると、一致しないパターンはエラーなしで消え、左から右に評価されます。&&||

これは確かに美学が不足して(申し訳ありませんが、@StéphaneChazelas!)、サブシェルの作成によりパフォーマンスが低下します。しかし、移植性が欲しいので、zsh固有の機能を実際に使用することはできません。

答え2

zsh 特定のセクションにあれば、bash 文句を避けることができます分析するコードは次のように実行されません。

eval 'cmd this_pattern*(N)'

変える

cmd this_pattern*(N)

evalPoV構文では、このコマンドはbashで有効です。次のeval場合にのみ無効になります。走るこの場合、cmd this_pattern*(N)Bashは無効なコードを解釈しようとします。

今この特定のケースでは

cmd this_pattern*(N)

bashで実際に動作するこのオプションを有効にすると(完全に異なる意味ですが)、bashは次の意味を含むextglobksh拡張glob演算子のサブセットを認識します。*(something)0something以上

この方法:

if [ -n "$BASH_VERSION" ]; then
  shopt -s extglob
fi

この場合、bashの解析エラーを事前に防ぐことができます。*.txt(N)たとえば、パターンには役立ちません。

関連情報