プロセス置換を使用するときにstdinを使用することと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
残りの行は変数に保存されます。$bytes
du -bcm
$_
du -bcm
今私はこれが何を意味するのかわかりません。-b
、-c
オプションは-m
標準ではありません。 while-c
は一般的で、累積サイズを提供するために使用されます。 GNUの場合、du
ファイル-b
サイズをバイト単位で取得し(ディスク使用量ではありません)、while-m
はサイズを次のメガバイトに丸め、オプションが競合します(おそらく使用されますが)-b
有効な副作用です--apparent-size
。 FreeBSD duには-m
(メガバイト)があり、no -b
、Solarisには両方ありません...
これは作成方法が複雑なようです。
wc -c < random_iso.iso
または:
du --apparent-size -cm random_iso.iso | awk 'END{print $1}'
GNUシステムでは、必要に応じてファイルサイズは次のメガバイトに丸められます。
答え2
前述したように、_<
これはリダイレクトではありません。これは_
、最後の引数として渡され、次にread
プロセス<
置換出力を標準入力にリダイレクトする別のリダイレクト演算子として解釈されます。
_
Bashスクリプトでは、組み込み変数を「使い捨て変数」として使用することが一般的な慣行となりましたread
。 Bashで_
各コマンドが実行された後にコマンドの最後の引数に設定される特殊変数。この場合、これは残りのすべてのフィールドが割り当てられるのではなく、最初のフィールドが割り当てられ、bytes
残りのフィールドが変数に削除されることを意味します。_
bytes
これは一般的な慣行ですが、_
この方法で乱用を避けるべき正当な理由がたくさんあります。
_
POSIXはこの動作を指定しません。ほとんどのシェルは特別な操作を行いません。- にはこのプロパティがあり
zsh
、このプロパティを使用するとシェルでエラーが発生します。_
readonly
- では対話型
mksh
モード_
の bash 動作のみがあります。非対話型スクリプトでは_
他の目的に使用され、各コマンドの後には何も割り当てられません。 - inは、
ksh93
1_
行の最後のコマンドの最後の引数にのみ設定されます。コマンドは物理的に別々のコード行になければなりません_
。また_
、ksh93はさまざまなコンテキストでさまざまな目的で使用できるようにオーバーロードされているため、_
この目的に割り当てることはお勧めできません。コンテキスト操作によって異なる方法で実行されます。
状況をより明確にするために、リダイレクトの前にスペースを追加することをお勧めします。私は良いリダイレクトスタイルのいくつかのガイドラインこの記事。