シェルのリダイレクトとパイプについての質問です.
リダイレクトでコマンドの標準出力をファイルに指定した後に,
パイプを置いて,もう一つコマンドを並べたとき,
後の方のコマンドの標準入力はどうなるのでしょうか?
例えば,
ls >outfile |cat
ならば,
catの標準入力には,何も入ってこないと思うのですが,
これを実行すると,lsの結果がoutfileに書き込まれ,
次のプロンプトが表示されます.
普通,catを引数なしで実行すると,
EOFが入力されるまで,入力待ちになると思うのですが,
こうならないのは,シェルがcatの標準入力にEOFを入力したからだと
考えていいのでしょうか.
よろしくお願いします.
(質問の意味が分かりにくければご指摘下さい.)
No.2ベストアンサー
- 回答日時:
パイプ処理の順序としては、細かい説明は省きますが、パイプが作られ、次にプロセスが作られ、各プロセスでリダイレクトの処理が行われ、最後にそれぞれプログラムが起動されます。
リダイレクトが優先されるように見えるというのはそういうことです。
ls > outfile | cat
だと、前半の > のリダイレクト処理の時点で、パイプの入り口がcloseされます。入り口がクローズされたパイプの出口を読もうとすると、EOFが返るので、cat は終了します。これはシェルの機能と言うより、OSのパイプの機能です。
ls | cat < infile
同じく、後半のリダイレクト処理の時点で、パイプの出口がcloseされます。出口がクローズされたパイプの入り口に書き込もうとすると、SIGPIPE というシグナルが発生します。
(ls ; echo "ls status=$?" >&2 ) | cat < infile
を実行すると、
ls status=141
と表示されるはずです。141 というステータスは、プロセスがSIGPIPEで終了したと言うことです。
なお、シェルによってclose等ののタイミングが異なるようで、sh bash以外では上記と異なる場合があります。
>パイプ処理の順序としては、細かい説明は省きますが、パイプが作られ、次にプロセスが作られ、各プロセスでリダイレクトの処理が行われ、最後にそれぞれプログラムが起動されます。
とても参考になりました.
(ls ; echo "ls status=$?" >&2 ) | cat < infile
という方法も教えていただき有り難うございます.
No.1
- 回答日時:
ls > outfile | cat
のcatは標準入力からの入力を一切受け取りません。考え方としてはEOFしかこなかったと考えていただいても結構ですが、正確にはそういう事(標準入力からの入力がない)です。
ls | cat < infile
こちらは
ls < infile | cat
と見比べていただけたら大体意味が分かるのではないでしょうか。ためしに
cat -n < infile | cat -n
とやってみてはどうでしょうか。
ただ、ご存知の通りパイプとリダイレクトは「シェルの機能」です。なので、パイプやリダイレクトはこうあるべきという規定はありますが実装依存という事になります。実際に、FreeBSD 8.0-RELEASEのcshで
ls | cat < infile
としたところ、Ambigous input redirectというエラーになりました。同じくFreeBSD 8.0-RELEASEのパッケージからインストールしたbashではリダイレクトが優先されました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ターミナルが全く入力できない
-
Cシェル内でBシェルの様な関数...
-
.cshrc ファイルについて
-
Solaris9でdateコマンドの結果...
-
ソフトシェルセットとBOXセット
-
バックスラッシュの意味がわか...
-
シェルスクリプトを途中からバ...
-
[UNIXコマンド] eval教えて下...
-
コマンドプロンプトとかで、net...
-
$1や$@や$$の意味が載っているman
-
unix初心者です
-
リナックスユーザーのファイラー
-
UNIX(hp-ux)のコマンド履歴↑↓
-
UNIXシェルプログラミング、初...
-
quota をコマンドだけで設定可...
-
solarisのsetenvが無効
-
シェルで引数した「*」をそのま...
-
シェルスクリプトの中であるプ...
-
BシェルとBashの違い
-
csh (tcsh)での環境変数の長さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
export と set は違うの?
-
ターミナルが全く入力できない
-
.cshrc ファイルについて
-
Cシェル内でBシェルの様な関数...
-
ubuntuの端末の左にカレントデ...
-
『存在するかどうか分からない...
-
posixでshellを起動したとき`da...
-
シェル(ksh)で変数にある文字列...
-
コマンドプロンプトとかで、net...
-
lsコマンド部分一致方法
-
シェルスクリプトで #!/bin/sh ...
-
シェルスクリプトに関する問題...
-
バックスラッシュの意味がわか...
-
シェル 会話形式でエンターキ...
-
Solaris9でdateコマンドの結果...
-
シェルスクリプトの中であるプ...
-
pc98のコマンドプロンプトからD...
-
unix初心者です
-
[UNIXコマンド] eval教えて下...
-
csh (tcsh)での環境変数の長さ...
おすすめ情報