このコマンドをCで再生成するように要求されましたが、cmd1が何であるかについての追加情報はありません。
< file1 cmd1 | cmd2 > file2
私の問題はコマンドの最初の文字です<
。
パイプの後ろのコマンドを無視してcmd1があるとしますcat
。
だからこれをCでより簡単に< file1 cat
置き換えることができます。cat file1
しかし、このアプローチは他のコマンドでも機能しますか?
私は次の2つのコマンドを使ってこれをテストしましたcat
。sed
< Makefile cat
cat Makefile
そして
< Makefile sed 'p'
sed 'p' Makefile
両方とも同じ結果を印刷します。それでは、私が< file1 cmd1
それを次のように解釈できると仮定するのは安全ですかcmd1 file1
?
ベストアンサー1
いいえ、できません。
コマンドライン引数としてリストされているファイルやファイルが提供されていない場合は、stdinが処理するデータを読み取る最も一般的なテキスト処理ツール(sed
、cut
など)などの多くのプログラムがありますが、これはgrep
すべてのプログラムの場合です。コマンドライン引数はstdinを介して提供されるデータとは異なり、これを処理するのはプログラムに依存します。
rm
明らかな反例は、標準入力をまったく読み取らないこのようなプログラムです。しかし、同等のものが真であると思っても、ファイル名引数をまったく受け入れないフィルタtr
に似たコマンドがあります。wc
他の出力。
コマンドライン構文はtr
おおよそ次のとおりです。
tr [options] string1 [string2]
ファイル名を引数として受け入れませんが、常に標準入力を読み込みます。
したがって、ターン
< file.txt tr abc xyz
入力する
tr abc xyz file.txt
エラーのみが発生します。
コメントで述べたように、wc
これは極端ではありませんが、別の方法で動作する別の一般的なツールです。ファイル名が与えられると、出力に含まれます(とは異なり、ファイル名が1つしかない場合でもgrep
)。
$ wc hello.txt
1 1 4 hello.txt
$ wc < hello.txt
1 1 4
また、多くのプログラムはstdinを読み取るための明示的なコマンドとしてファイル名を使用します-
が、シェルはそれをサポートしていません。したがって、cat < -
というファイルを読み込むとき-
の標準入力(おそらく端末)から読みますcat -
。cat