パイプで使用するときのBashの「:」(コロン)関数の意味は何ですか?

パイプで使用するときのBashの「:」(コロン)関数の意味は何ですか?

質問

:パイプラインでの使用に関する意味は何ですか?

これバッシュ文書状態:

: [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つの四半期にはここに示されているものよりも多くがあります。ifelse

今、私はtr -d '\r'これがキャリッジリターンなしで問題がないことを知っています。ただし、これは呼び出しであるため(Windowsでは)オーバーヘッドを回避できます(関数は「ホット」コードパスです)。それで、tr組み込みのシェル関数に置き換えようと思いました:

ベストアンサー1

この場合、遷移的な置換は、cat入力を出力にコピーすることです。:何もしないので、入力内容が失われます。

$ echo hello | :
$

実際には:入力を読み取らないため、パイプに入力するコマンドは1つを受け取るため、SIGPIPE操作を完了または開始できない可能性があります。

$ (seq 1 10000 | tee /dev/stderr; echo $? 1>&2) | :
141

使用はcat外部呼び出しを意味しますtr。 (しかし、作業量が少し少ない) Bashには、このタイプのパスの組み込みパスはありません。

おすすめ記事