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}(...)
kshglob
zsh
extglob
bash
bash
{x,y}(...)
a='{1}(2){3}'; [[ $a = $a ]]