ここで問題は勇敢な次の文。私がこれをやろうとしているとしましょう:
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規格では:
file1
、file2
比較するファイルのパス名。file1
ORfile2
オペランドがある場合は、標準-
入力を代わりに使用する必要があります。