`sort <(ls -l)`はうまくいきますが、 `sort <(ls -l)`が失敗するのはなぜですか?

`sort <(ls -l)`はうまくいきますが、 `sort <(ls -l)`が失敗するのはなぜですか?

今日、私は次の記事を通してfifoについて学びました。名前付きパイプの紹介、そこに言及されていますcat <(ls -l)

いくつかの実験をしましたが、sort < (ls -l)エラーが発生しました。

-bash: syntax error near unexpected token `('`

その後、誤ってコマンドにスペースを追加したことがわかりました。

しかし、この追加コマンドがこれらのエラーを引き起こすのはなぜですか?リダイレクトシンボルはなぜ互いに近いのですか(

答え1

なぜなら、それはaではなく、<まったく<()異なるaだからです。これは…プロセスの交換、これはあるプロセスの出力を別のプロセスの入力として使用できるいくつかのシェルの機能です。

演算子><出力と入力をリダイレクトします。文書。演算子は<()ファイルではなくコマンド(プロセス)を処理します。走るとき

sort < (ls)

lsサブシェル(角かっこの意味)でコマンドを実行し、そのサブシェルを入力ファイルとしてsort

答え2

なぜなら、状況がそうだからです。

<(...)in はbashプロセス置換構文です。同じ演算子からコピーされましたksh

<、、、、、、、は(、さまざまな組み合わせで特殊演算子を形成するために使用される)特殊|語彙表示です。 ,,,... それぞれの役割があります。リダイレクトのため。 、ファイルから入力をリダイレクトします。名前付きファイルから入力をリダイレクトしますが、リダイレクト演算子以外の演算子です。&;bash<<(<<<&<<file< file<'(file)'(file)<(file)

< (file)<次はです(file)。この場合にはbash(file)効果がありません。(...)場合によっては、単一のトークンで有効になることがあります。たとえば、次のようになります。

(sub shell)
func () {
  ...
}
var=(foo bar)

しかし、中にはありません。

sort < (cmd)

シェルではfish状況が異なります。 In fish(...)コマンドの置き換えに使用されます($(...)inと同じbash)。<Bourneなどのシェルのように入力リダイレクトに使用されます。

だからfish

sort <(echo file)

以下と同じです。

sort < (echo file)

それは:

sort < file

bashただし、これはプロセスの交換とはまったく異なります。

yashシェルは、<(...)次の目的で使用されていない別のPOSIXシェルです。プロセスの交換それ以外の場合プロセスリダイレクト

そこ、

sort <(ls -l)

不足:

sort 0<(ls -l)

リダイレクト演算子です。以下と多少同じです。

ls -l | sort

in はbashパイプパス<(ls -l)に拡張されるため、次のようになります。

ls -l | sort /dev/fd/0

は、globbing演算子(およびファイルに拡張されている)とglob修飾子(たとえば、ディレクトリファイルに拡張されている)にオーバーロードされzshます。(...)(*.txt|*.png)txtpng*(/)

からzsh

sort < (ls -l)

これは(ls -l)グローバル修飾子として扱われます。 globl修飾子はリンクの数を一致させるために使用され、その後に数字がなければなりませんl(たとえば、ls -ld ./*(l2)2つのリンクを持つファイルのリストなど)。これがzsh: number expectedエラーが発生する理由です。

sort < (w)書き込み可能な空の名前のファイルが一致するため、zsh: no matches found: (w)エラーが発生します。(w)

sort < (w|cat)現在のディレクトリおよび/またはファイルwの内容を並べ替えます。cat

関連情報