bash の標準入力に < の代わりに _< を使用する

bash の標準入力に < の代わりに _< を使用する

プロセス置換を使用する場合、 _<と をstdin に使用することの違いは何ですか。これは bash を使用して行われます。<

例:

read bytes _< <(du -bcm random_iso.iso | tail -1); echo $bytes

答え1

これは演算子ではなく_<_読み取りに渡す引数とリダイレクト演算子です<<(cmd)それ自体はプロセス置換です (パイプを指すファイル名に展開されます)。

それは次のものを実行します:

read bytes _  < /proc/self/fd/x

ここで、fd x はパイプの読み取り端です。

パイプのもう一方の端 (書き込み側) では、バックグラウンド サブシェル プロセスが実行されdu -bcm random_iso.iso | tail -1、その標準出力がそのパイプにリダイレクトされます。

したがって、の出力の最後の行の最初の単語が変数readに格納され、行の残りの部分が変数に格納されます。$bytesdu -bcm$_

du -bcmそれがどこで意味をなすのか私にはわかりません。 -b-c、 のいずれも-m標準オプションではありません。 は-c非常に一般的で、 は累積サイズを指定するものですが、GNU ではdu-bはファイル サイズ (ディスク使用量ではありません) をバイト単位で取得し、は次のメビバイトに切り上げられたサイズを取得するため、これらは競合するオプションになります (ただし、を有効にするという副作用のために-m使用されている可能性があります)。FreeBSD の du には(メビバイト用) があり、 はなく、Solaris にはどちらもありません...-b--apparent-size-m-b

どうやら、これは複雑な書き方を意図していたようです:

wc -c < random_iso.iso

または:

du --apparent-size -cm random_iso.iso | awk 'END{print $1}'

GNU システムでファイル サイズを次のメビバイトに切り上げることを本当に望んでいる場合。

答え2

前述のように、_<はリダイレクトではありません。 これは_の最終引数として渡されますread。 は<、プロセス置換の出力を stdin にリダイレクトする別のリダイレクト演算子として解釈されます。

_Bash スクリプトでは、組み込みと組み合わせて を「使い捨て変数」として使用するのが一般的になりましたread。bash では、 は、_各コマンドの実行後にコマンドの最後の引数に設定される特別な変数です。この場合、 には最初のフィールドが割り当てられ、残りのフィールドはにすべて割り当てられるのではなく、bytesに破棄されて変数に格納されます。_bytes

_これは慣例ですが、このように乱用することを避けるべき十分な理由がいくつかあります。

  • この動作は_POSIX では規定されていません。ほとんどのシェルはこれに対して特別な処理は行いません。
  • ではzsh、には 属性_がありreadonly、これを使用するとシェルによってエラーがスローされます。
  • ではmksh_対話モードでのみ bash の動作が行われます。非対話型スクリプトでは、_は別の目的で使用され、各コマンドの後に何も割り当てられません。
  • ではksh93_は行の最後のコマンドの最後の引数にのみ設定されます。 を使用するには、コマンドはコードの別の行に物理的に配置する必要があります_。さらに、_ksh93 では、 はさまざまなコンテキストで他の多くの用途を持つようにオーバーロードされているため、_この目的で を割り当てることは推奨されず、コンテキストに応じて異なる動作をします。

リダイレクトをわかりやすくするために、リダイレクトの前にスペースを入れることをお勧めします。リダイレクトのスタイルに関するガイドラインをいくつか掲載しました。この記事

関連情報