web-dev-qa-db-ja.com

入力リダイレクトによるプロセス置換

プロセスの置換と組み合わせた入力リダイレクトを理解しようとしています。 bash3を使用しています

trの例は次のとおりです

_$ tr "o" "a" <(echo "Foo")
tr: extra operand `/dev/fd/63'
Try `tr --help' for more information.
_

なぜこれがうまくいかないのか理解できたと思います。プロセス置換<( )はファイル記述子を作成し、trは標準入力からのみ読み取ります。

適切なリダイレクトで機能させるにはどうすればよいですか?

私は単にパイプを使用できることを知っています:

_$ echo "Foo" | tr "o" "a"
Faa
_

しかし、私はより良い理解を得ようとしています。 _man bash_を使用して、_<&_を使用していくつかのことを試しましたが、自分が何をしているのかよくわかりません。

trを使用してプロセス置換を適切に使用するにはどうすればよいですか?

7
Bernhard

あなたは本当に近かった:

_tr "o" "a" < <(echo "Foo")
_

置換<()はファイル記述子を作成し、シェルへのパスを貼り付けるだけです。理解するには、以下を実行するだけです。

_<(echo blubb)
_

エラーが表示されます:

_-bash: /dev/fd/63: Permission denied
_

そのため、_/dev/fd/63_をシェルに貼り付けるだけで、_/dev/fd/63_は単純なパイプであるため、実行できません。上記のtr-例では、パイプに書き込むのは_echo "Foo"_であり、入力リダイレクトを介して_<_ファイル記述子から読み取るのはtrコマンドです。

10
chaos

Bash One-Liners Explained シリーズは、これらすべてについて理解するのに非常に役立ちます。

具体的には、上記のリンク先の記事はすべて入力リダイレクトに関するものです。

上記の特定の例を解決するには:

> tr "o" "a" <<< $(echo "Foo")
Faa
3
jas_raj