変数のKSHモードが機能しません。

変数のKSHモードが機能しません。

Kornシェルのパターン(変数に割り当て)が次のように機能する理由を説明できる人はいますか?

u@h:w$ pattern='file_[0-9][0-9]'
u@h:w$ ls $pattern
file_01  file_02  file_03

ただし、スマートモードでは機能しませんfile_{2}([0-9])

$ pattern='file_{2}([0-9])'
$ ls $pattern
ls: file_{2}([0-9]): No such file or directory

答え1

これはPOSIX規制違反を防止するための意図です(もともとBourne互換性違反を防止する意図でしたが)。

echo file_{2}([0-9])

これはBourne / POSIXでは無効なコードなので、sh自由にksh解釈してください。しかし:

pattern='file_{2}([0-9])'
echo $pattern

有効なBourne / POSIXコードであり、POSIXによると、名前が...のファイルshと一致するように設計されています。file_{2}(0)file_{2}(1)

以下を使用しても拡張結果の場合は、スプレッド演算子を使用できません。

echo @($pattern)

を使用する必要がevalあるか、次のものを使用できますFIGNORE

FIGNORE="!($pattern)"; echo *

(隠しファイルの拡張に影響を与えるため、FIGNORE="@(.*|!($pattern))"globが隠しファイルを拡張しないようにするには、これを行います)。

これらの拡張演算子のいくつかはbash後でzsh採用されましたが(排他的ではありませんが)、POSIX準拠/ Bourne互換性を他の方法で解決しました。これらの拡張globをすべてのコンテキストで使用できるようにしましたが、特定のオプションが有効になっている場合(in、内)。ただし、これは以前のバージョンとの互換性を維持しながら、より多くの演算子を追加することが困難であることを意味します。たとえば、今演算子を追加すると、trueを返すと予想されるスクリプトがクラッシュする可能性があります。ksh{x,y}(...)kshglobzshextglobbashbash{x,y}(...)a='{1}(2){3}'; [[ $a = $a ]]

関連情報