質問
:
パイプラインでの使用に関する意味は何ですか?
これバッシュ文書状態:
: [arguments]
効果はありません。コマンドは、パラメーターを拡張し、指定されたリダイレクトを実行する以外は何も行いません。戻り状態は 0 です。
:
ただし、パイプラインで使用するときにどのような動作を期待するかは不明です。ただ渡されますかstd{in,out,err}
?
:
パラメータは他のコマンドに置き換えることができるようです。しかし、パイプラインでの使用法を明確にする必要があります。説明は観察に基づいているだけでなく、権威ある情報源引用。
背景
tr -d '\r'
スクリプトが実行される環境によっては、出力からキャリッジリターンを削除するために出力を実行する必要がある状況が発生しました。
ああ、現在これはif/else/fi
次のブロックを意味します。関数の内部):
if [[ "$OSTYPE" == "cygwin" ]]; then
my_commands | tr -d '\r' || return $?
else
my_commands || return $?
fi
ここでは、| tr -d '\r'
ブランチと唯一の違いです。もちろん、2つの四半期にはここに示されているものよりも多くがあります。if
else
今、私はtr -d '\r'
これがキャリッジリターンなしで問題がないことを知っています。ただし、これは呼び出しであるため(Windowsでは)オーバーヘッドを回避できます(関数は「ホット」コードパスです)。それで、tr
組み込みのシェル関数に置き換えようと思いました:
。
答え1
この場合、遷移的な置換は、cat
入力を出力にコピーすることです。:
何もしないので、入力内容が失われます。
$ echo hello | :
$
実際には:
入力を読み取らないため、パイプに入力するコマンドは1つを受け取るため、SIGPIPE
操作を完了または開始できない可能性があります。
$ (seq 1 10000 | tee /dev/stderr; echo $? 1>&2) | :
141
使用はcat
外部呼び出しを意味しますtr
。 (しかし、作業量が少し少ない) Bashには、このタイプのパスの組み込みパスはありません。
答え2
奇妙な名前にかかわらず、:
これはまだコマンドであり、コマンドのように動作するため、何もしないとパイプから何も読み取らないことを意味します。ある意味、これはシェルの特別な構文ではなく、| : |
再び|
。POSIXの説明:
標準入力または標準出力を「使用」しないと言うが、もちろんパイプについて明示的に言及するものではない。
これにはいくつかの解決策があります。条件付きパイプラインcat
しかし、ほとんどの場合、途中でコピーを実行しないことは困難または厄介です。
ls
(小文字:POSIXテキストは「ユーティリティ」という用語を使用していますが、まだ使用されている用語と同じです:
。 。
答え3
マニュアルページのキーフレーズは:
(同義語と同じtrue
)です。何もしなかった。入力から何も読み取らず、出力ストリームに何も書きません。
パイプではあまり役に立ちません。パイプが詰まるのに役立ちます。