標準出力リダイレクト後のパイプの目的は何ですか?

標準出力リダイレクト後のパイプの目的は何ですか?

文書を読んでいます。ゲアル以前見たことのないシェルリダイレクトとパイプ構造を見ました。

echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | tar -cf - Dockerfile

出力はechoにリダイレクトされDockerfile、私が知っている限り何も得られません|。私はいつもtarorとコマンドを&&組み合わせています||が、この場合はパイプレスを使用する特別な目的があるかどうか疑問に思います。

答え1

コマンドラインは有効で、タイプミスではありません。

Dockerコンテナ内で次のコマンドを実行すると、機能していることを確認できます。

docker run -it --rm alpine sh -c 'echo -e "FROM alpine \nRUN echo \"created from standard input\"" > Dockerfile | tar -cf - Dockerfile'

次のコマンドを使用して同じ動作を観察できますcat

echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | cat Dockerfile

私の考えでは、あなたが提供されたオプションを誤解した可能性があるということですtar。標準入力から読み込むのではなく、標準出力に書き込みます。

説明する

シェルは最初のプロセス(echo)と対応するstdout(Dockerfile)を生成し、次のプロセス(tar)を生成します。どちらのプロセスも実行を開始してDockerfile既に存在するため、tarそのプロセスから読み取りを開始して出力を標準出力に書き込むことができます。

場合によっては、stdoutがttyなので(一部の説明に示すように)stdoutをファイル()のようにtarが書くことができるものに置き換える必要がありますDockerfile.tar。元のコマンドを変更せずにtarコマンドに出力リダイレクトを追加してファイルに書き込むだけで、同じ結果を観察できます。

echo -e 'FROM alpine \nRUN echo "created from standard input"' >Dockerfile | tar -cf - Dockerfile >Dockerfile.tar

関連情報