コマンドが Go でパイプされているかどうかを確認するには?
Go で入力と出力を操作する場合、多くの場合、次のことを確認する必要があります。コマンドがパイプ処理されているかどうか。パイプ処理を使用すると、Unix パイプを介して、あるプロセスの出力から別のプロセスの入力にデータを渡すことができます。
例:
<code class="sh">cat test.txt | mygocommand # Piped mygocommand # Not piped</code>
この区別は、アプリケーションの動作をカスタマイズする場合に重要です。 .
解決策
Go は、os.Stdin.Stat() を使用して stdin がパイプされているかどうかを確認する方法を提供します。以下に例を示します。
<code class="go">package main import ( "fmt" "os" ) func main() { fi, _ := os.Stdin.Stat() if (fi.Mode() & os.ModeCharDevice) == 0 { fmt.Println("data is from pipe") } else { fmt.Println("data is from terminal") } }</code>
コマンドがパイプ処理されると (最初の例のように)、出力は次のようになります:
data is from pipe
それ以外の場合は、次のようになります:
data is from terminal
仕組み
os.Stdin.Stat() 関数は、stdin ファイル記述子に関する情報を含む FileInfo オブジェクトを返します。 FileInfo の Mode() メソッドは、ファイルの種類に関する情報を含むファイル モードを返します。返されたモードに os.ModeCharDevice フラグが含まれている場合、ファイルが端末などのキャラクタ デバイスであることを示します。そうでない場合は、ファイルが通常のファイルまたはパイプであることを示します。
以上がGo コマンドはパイプからデータを受信していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。