`< file1 cmd1`を `cmd1 file1`として解釈できますか?

`< file1 cmd1`を `cmd1 file1`として解釈できますか?

このコマンドをCで再生成するように要求されましたが、cmd1が何であるかについての追加情報はありません。

< file1 cmd1 | cmd2 > file2

私の問題はコマンドの最初の文字です<

パイプの後ろのコマンドを無視してcmd1があるとしますcat

だからこれをCでより簡単に< file1 cat置き換えることができます。cat file1しかし、このアプローチは他のコマンドでも機能しますか?

私は次の2つのコマンドを使ってこれをテストしましたcatsed

< Makefile cat
cat Makefile

そして

< Makefile sed 'p'
sed 'p' Makefile

両方とも同じ結果を印刷します。それでは、私が< file1 cmd1それを次のように解釈できると仮定するのは安全ですかcmd1 file1

ベストアンサー1

いいえ、できません。

コマンドライン引数としてリストされているファイルやファイルが提供されていない場合は、stdinが処理するデータを読み取る最も一般的なテキスト処理ツール(sedcutなど)などの多くのプログラムがありますが、これは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

おすすめ記事