Bashプロセスの置き換え:標準入力を移植可能に参照する方法は?

Bashプロセスの置き換え:標準入力を移植可能に参照する方法は?

ここで問題は勇敢な次の文。私がこれをやろうとしているとしましょう:

diff -u <(some command) {mystery-syntax}

stdinの出力をsome command端末のコピー/貼り付けなどの一部のデータと比較しています。このように:

$ diff -u <(echo foo) {mystery-syntax}
bar
[Ctrl-D]
--- /dev/fd/63  2021-11-04 11:28:19.360366909 -0700
+++ /dev/fd/62  2021-11-04 11:28:19.360366909 -0700
@@ -1 +1 @@
-foo
+bar

{mystery-syntax}メタトークンはどのような実際の構文を扱いますか?

このdiffユーティリティは標準入力指定規則を使用しないため-使用できません。

1つの答えは次のとおりです/dev/fd/0

$ diff -u <(echo foo) /dev/fd/0
bar
[Ctrl-D]
--- /dev/fd/63  2021-11-04 11:31:02.837040697 -0700
+++ /dev/fd/0   2021-11-04 11:30:56.807964644 -0700
@@ -1 +1 @@
-foo
+bar

さて、私たちはLinuxベースのシステムで一方向に動作するようにしました/dev/fdしかし、ファイルシステムを参照しない方法はありますか/dev(これはシステム固有の実装の詳細です)?私は例外があると思います/dev/fd。このマニュアルには次の内容が記載されています。

プロセス置換は、名前付きパイプ(FIFO)または/ dev / fd名前付きファイルを開く方法をサポートするシステムでサポートされています。

たとえば、次のようになります。

diff <(echo foo) <(cat)

何らかの理由で動作しません。<(cat)プロセスが必要な出力のみを置き換えても、catまだcat標準入力なしで呼び出されます。

$ diff -u <(echo foo) <(cat)
cat: -: Input/output error
--- /dev/fd/63  2021-11-04 11:33:59.303347814 -0700
+++ /dev/fd/62  2021-11-04 11:33:59.303347814 -0700  
@@ -1 +0,0 @@
-foo

ここにも「スマートな」行動があります。明示的に入力/dev/fd/0にリダイレクトしても、まだ退屈です。cat

$ diff -u <(echo foo) <(cat < /dev/fd/0)
cat: -: Input/output error

しかし!ここで文書を標準入力として提供することはcat妨げられません。

$ diff -u <(echo foo) <(cat <<<"bar")
--- /dev/fd/63    2021-11-04 11:40:03.612616179 -0700
+++ /dev/fd/62    2021-11-04 11:40:03.612616179 -0700
@@ -1 +1 @@
-foo
+bar

ベストアンサー1

diffコマンドラインで指定されたファイル名の1つが-(ダッシュ)の場合、ユーティリティは標準入力からその場所を読み取ります。

$ echo hello | diff -u <( echo ok ) -
--- /dev/fd/12  Fri Nov 12 21:25:18 2021
+++ -   Fri Nov 12 21:25:18 2021
@@ -1 +1 @@
-ok
+hello

GNUdiffマニュアルから:

a がFILEあれば-標準入力を読みます。

OpenBSDマニュアルから:

file1または、この場合、file2標準-入力が代わりに使用されます。

POSIX規格では:

file1file2
比較するファイルのパス名。file1ORfile2オペランドがある場合は、標準-入力を代わりに使用する必要があります。

おすすめ記事