基本情報技術者 2016年 春期 午前(科目A) 問18
問題文
UNIXにおいて、あるコマンドの標準出力を、直接別のコマンドの標準入力につなげる機能はどれか。
選択肢
ア:パイプ(正解)
イ:バックグラウンドジョブ
ウ:ブレース展開
エ:リダイレクト
🔒 解説は解答すると表示されます
パイプによる標準入出力接続【午前解説】
正解の理由
正解は ア(パイプ)です。パイプ(|)は一連のコマンドを接続して前段の標準出力を次段の標準入力に直接流す仕組みであり、コマンド同士をストリームとして連結するために設計されています。これによりフィルタ処理やストリーム処理をシェル上で簡潔に実現できます。
解法ステップ
- 問題文のキーワード「標準出力を直接別コマンドの標準入力につなげる」を確認する。
- 各選択肢の機能を頭の中で短く定義する(パイプ、リダイレクト、バックグラウンド、ブレース展開)。
- 「直接つなぐ=コマンド間のストリーム連結」と判断できればパイプを選ぶ。
- 迷ったら具体例を思い浮かべて検証(例:ls | grep)。
選択肢別の誤答解説
- ア: パイプ — 正解です。記号「|」で前コマンドの stdout を次コマンドの stdin に接続します。
- イ: バックグラウンドジョブ — 誤り。記号「&」はコマンドをバックグラウンドで実行するための指定で、入出力接続のための機能ではありません。
- ウ: ブレース展開 — 誤り。シェルの文字列生成機能であり、{a,b} のように引数リストを展開するためのもので、入出力接続は行いません。
- エ: リダイレクト — 誤り。
>や<はファイルとの入出力を制御するもので、コマンド同士を直接つなぐ機能とは異なります(ただし名前付きパイプやプロセス代替で類似の振る舞いは可能)。
よくある誤解
- 「リダイレクトも同じ」と混同する:リダイレクト(>, <)はファイルとの入出力を扱い、直接コマンド同士をつなぐものではありません。
- 「パイプで標準エラーもつながる」と思い込む:パイプは通常 stdout(ファイル記述子1)をつなぐだけで、stderr(fd 2)は別扱いです(必要なら 2>&1 等を使います)。
- 「バックグラウンドにすればつながる」との誤解:& は実行の前後関係(フォア/バックグラウンド)の制御であり、入出力の接続機能ではありません。
補足コラム
- パイプは一方向の通信チャネルで、標準的には stdout → stdin の流れになります。stderr を含めたい場合は
2>&1やcommand 2>&1 | anotherのようにリダイレクトを組み合わせます。 - 名前付きパイプ(FIFO、mkfifo)やプロセス代替(bash の <(...) や >(...))を使うとファイル的にコマンドをつなげる高度な構成が可能です。
- パイプは各コマンドをサブプロセスとして実行しつつストリームを繋ぐため、パフォーマンスや終了ステータスの取り扱い(多くのシェルではパイプライン全体の終了ステータスは最後のコマンドの値)に注意が必要です。
- 出力を分岐してファイルにも保存したい場合は
teeを使います(例:cmd | tee out.txt | other)。
FAQ
Q1: パイプで stderr も渡せますか?
A1: 直接は渡りません。
A1: 直接は渡りません。
2>&1 を使って stderr を stdout にリダイレクトした上でパイプに流す必要があります(例:cmd 2>&1 | grep pattern)。Q2: パイプラインの終了ステータスはどうなりますか?
A2: 多くのシェルではパイプラインの終了ステータスは最後のコマンドの終了コードです。bash では
A2: 多くのシェルではパイプラインの終了ステータスは最後のコマンドの終了コードです。bash では
set -o pipefail を使うとどれかが失敗した場合にパイプ全体を失敗とできます。Q3: 複数コマンドを連結できますか?
A3: はい、
A3: はい、
cmd1 | cmd2 | cmd3 のように何段でもパイプで連結してデータを逐次処理できます。関連キーワード: UNIX、シェル、パイプ、パイプライン、stdin、stdout、stderr、リダイレクト、バックグラウンド、ブレース展開、FIFO、プロセス代替、tee、mkfifo、パフォーマンス、pipefail

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

