stdin とは何か? 標準入力ストリーム
stdin (標準入力) は、プログラムが到来するデータを read するデフォルトのストリームで、通常は対話的にはキーボード、スクリプトではファイルや pipe です。
すべてのプログラムは 3 つの標準ストリームで始まり、stdin はそれが read する対象です。対話的には、stdin はキーボードです。スクリプトでは、しばしばファイルや pipe で送られてくる別のコマンドの出力です。キーボードのない CI では、stdin を理解することで、なぜ一部のツールが決して来ない入力を待って停止するのかが説明できます。
stdin とは
stdin は file descriptor 0 で、プロセスがデフォルトで入力を read するチャネルです。シェルの read や Python の input() のような関数は、stdin から取り込みます。
stdin はどこから来るか
対話的なプロンプトでは、stdin は端末に接続されています。pipeline では、前のコマンドの出力が次のコマンドの stdin になります。リダイレクトを使うと、ファイルを stdin として供給できます。
stdin を供給する
- pipe:
cat data.txt | sortはcatの出力を stdin 経由でsortに送る。 - リダイレクト:
sort < data.txtはファイルを stdin として read する。 - here-document は複数行をインラインで stdin として供給する。
CI で stdin が重要な理由
CI は非対話的に実行されるので、stdin の背後にキーボードはありません。確認を求めるツールは停止するか end-of-file を read します。--yes のようなフラグを渡すか、必要な入力を pipe で送ることで、こうした停止を回避できます。
CI での閉じた stdin
多くの CI 環境では stdin が閉じているか空なので、read は即座に返ります。対話的な入力を前提とするスクリプトは、代わりに引数や環境変数を受け取るよう書き直さなければなりません。
managed runner と入力
Latchkey runner では job は無人で実行されるので、対話的な入力を必要としないよう step を設計してください。プロンプトを期待するのではなく、環境変数、ファイル、またはコマンドフラグを通じて値を提供しましょう。
重要なポイント
- stdin はデフォルトの入力ストリームで、file descriptor 0 です。
- キーボード、ファイル、pipe、または here-document から来ることができます。
- CI は非対話的なので、stdin を待つツールは job を停止させることがあります。