よく使われる入力方法としては
標準入力があり
プログラム引数
ファイル
出力方法としては
標準出力があります。 入出力ともにネットワーク、プロセス間通信 etc などがありえます。
標準エラー出力 (コマンドの成否を表すメッセージなど)
ファイル
プログラムの戻り値(整数で正常終了した場合は普通0が返される)
では次のコマンドを例に解説していきます。
cat foo.txt | sort
まずcatコマンドの引数として foo.txt を入力しています。そしてcatコマンドはその引数を元にファイル内容を読み込み標準出力へと出力します。そして | パイプで接続され標準出力の内容が次のプログラムsortへ標準入力として渡されます。sortは引数がなければ標準入力の内容をソートして標準出力へと出力します。そしてsortの標準出力の内容はこの後に何も指定していないため画面へと出力されます。
次のように
cat foo.txt | sort > out.txt
> リダイレクトを使用することで標準出力の内容をファイルへと出力することができます。(この場合 out.txtはsortの引数として渡しているわけではありません。|や>はシェルの機能です。)
プログラム自体がファイルを直接出力するというパターンもあります。
gcc main.c -o app
gccコンパイラに引数としてmain.c -o appを渡しています。gccはmain.cファイルを読み込みコンパイルした内容をappという名前のファイルへ出力します。
さて入力方法としては引数と標準入力が主に使われていることがわかりました。またファイルとしての入力は引数でファイル名を指定して読み込むというパターンが多いこともわかりました。出力方法としては基本的に標準出力が使われていることもわかりました。標準出力は| パイプで接続すれば次の標準入力になることはわかりましたが、後続のコマンドの引数として入力するにはどうしたら良いのでしょうか。それにはxargsを使いましょう。
input.txt:
file1
file2
file3
cat input.txt | xargs cat
xargsは標準入力から渡された文字列をxargsの引数として渡されたcatの引数として呼び出します。つまりxargsは cat file1 file2 file3を呼び出します。catは複数のファイル名が引数として渡された場合はその内容を結合してから標準出力へ出力します。つまり上記コマンドはinput.txtに書かれているファイル名を読み込みそのファイル内容をすべて結合して画面に表示します。xargs -n1 catと指定すればcatに引数を最大1個だけ付加して呼び出します。つまりcat file1、cat file2、cat file3と3回に分けてcatが呼びだされます。catコマンドの場合は分割したところで出力結果は同じですが。
入力元 | 出力先 | 利用可能なコマンド |
---|---|---|
ファイル | 標準出力 | cat |
引数 | 標準出力 | echo、printf |
標準入力 | 引数 | xargs |
ネットワーク | ファイル | wget |
ネットワーク | 標準出力 | curl |
入力元 | 出力先 | シェルの機能 |
---|---|---|
標準出力 | 標準入力 | | |
標準出力 | 画面 | そのまま |
標準エラー出力 | 画面 | そのまま |
標準出力 | ファイル | > |
標準エラー出力 | 標準出力 | 2>&1 |
引数の指定方法によって入力元や出力先を変化させることのできるコマンドはよくあります。
入力元 | 出力先 | コマンド | 解説 |
---|---|---|---|
標準入力 | 標準出力 | grep パターン | 引数として渡したパターンを標準入力から検索し標準出力へ出力する |
引数のファイル名 | 標準出力 | grep パターン ファイル名 | 引数として渡したパターンをファイルから検索し標準出力へ出力する |
また多くのUNIXプログラムはファイル名を指定する部分に - を指定することでファイルの代わりに標準入力(または標準出力)を使用できます。
echo "int main(){}" | g++ -x c++ -
0 件のコメント :
コメントを投稿