STDINを介したリダイレクトされた入力が期待どおりに機能していません

A.エレット

STDINがあるかどうかをテストしていると思った場所にコードを書きました。しかし、コードは私が期待していたものとは逆に機能しました。

これが私が書いたコードです、私はそれを呼んでいます zit

#!/usr/bin/perl
use strict 'vars';

my @a = @ARGV ? @ARGV : "EMPTY";
printf "  command line arguments: \"%s\" as expected\n", @a;
if ( -t STDIN )
  {
    print "  ( -t STDIN ) returns TRUE\n";
  }
else
  {
    print "  ( -t STDIN ) returns FALSE\n";
    print "  But, I can iterate over <STDIN>!  Huh?? Behold:\n";
  }

これが私が思ったことです:

  • zit <(echo a;echo b)結果( -t STDIN )としてFALSE

  • zit < <(echo a;echo b)結果( -t STDIN )としてTRUE

そこで、何が起こっているのかを理解するために、ループをif-then追加しコードを変更しましたwhile(私の理解に基づいて、問題が発生するはずの場所に配置しました)。

#!/usr/bin/perl
use strict 'vars';

my @a = @ARGV ? @ARGV : "EMPTY";
printf "  command line arguments: \"%s\" as expected\n", @a;

if ( -t STDIN )
  {
    print "  ( -t STDIN ) returns TRUE\n";
  }
else
  {
    print "  ( -t STDIN ) returns FALSE\n";
    print "  But, I can iterate over <STDIN>!  Huh?? Behold:\n";
    while ( <STDIN> )
      {
        print ">> $_";
      }
  }

これがこのコードからの出力です

zit <(echo a;echo b) 次の出力があります

  command line arguments: "/dev/fd/63" as expected
  ( -t STDIN ) returns TRUE

zit < <(echo a;echo b) 次の出力があります

  command line arguments: "EMPTY" as expected
  ( -t STDIN ) returns FALSE
  But, I can iterate over <STDIN>!  Huh?? Behold:
>> a
>> b

私はこれに本当に混乱しています。これは、私が思っていたように動作していません。( -t STDIN )falseの場合whileループが機能するのはなぜですか?

誰かがここで何が起こっているのか説明できますか?

少し混乱を少なくするために、以前からこの投稿を再編集しました。

メルポメネー
use strict 'vars';

なぜあなたはこれをやっている?だけuse strict;でなく、3つの制限すべてを有効にする必要がありvarsます。また、する必要がありuse warnings;ます。


チェックするperldoc -f -tと、ドキュメントに次のように記載されていることがわかります。

-t Filehandle is opened to a tty.

言い換えると、STDINがあるかどうかをテストするのではなく(親プロセスがいたずらで、開始する前に閉じた場合を除いて、常にSTDINがあります)、STDINが端末を参照しているかどうかをテストします(略称「tty」は元々参照されていました)。テレタイプ、彼らが置き換えられたスタックの名前の種類テキスト端末以降の端末エミュレータxtermのような)。C用語では、への呼び出しに対応しますisatty

最初の例では、がありzit <(echo a;echo b)ます。この<( ... )表記により、bashは指定されたコマンドを実行し、STDOUTをパイプにリダイレクトします。次に<( ... )、パイプ(の読み取り側)を参照するファイル名に置き換えます。

具体的には、実行されますzit /dev/fd/63(ファイル記述子63は、書き込み端がによって供給されるパイプの読み取り端を指しますecho a; echo b)。STDINには何も起こらないためzit、シェルから標準ストリームを継承します。したがって、STDINは端末を参照し-t STDINます。これが、trueを返す理由です。

2番目の例では、がありzit < <(echo a;echo b)ます。これは非常に似ていますが、結果のコマンドはzit < /dev/fd/63です。この< FILE表記は、指定されたファイルを読み取り用に開き、STDINをそのファイルにリダイレクトするようにシェルに指示します。

したがってzit、STDINがパイプに接続された状態で(コマンドライン引数なしで)実行されます(パイプのもう一方の端はによって供給されますecho a; echo b)。これは事実上と同じ( echo a; echo b ) | zitです。ここで、zitのSTDINは端末ではなくパイプを参照しているため、-t STDINfalseを返します。もちろん、それでも読み取ることができます。読み取ることができるもののほとんどは、プレーンファイル、パイプ、ソケットなどの端末ではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Django; ajaxを使用すると、リダイレクトが期待どおりに機能しません

分類Dev

CSSを使用した自動インデックス行が期待どおりに機能していません

分類Dev

Angular出力から連結された文字列が出力され、期待どおりに機能していません

分類Dev

PHPスクリプトが期待どおりに機能していません

分類Dev

ELFバイナリのロードされたアドレスを取得します。dlopenが期待どおりに機能しません

分類Dev

動的に構築された述語が期待どおりに機能していません

分類Dev

手動で入力する場合、ポーリングはstdinで機能しますが、入力がパイプされてリダイレクトされない場合は機能しません。

分類Dev

オーバーロードされたDoubleEqual演算子が期待どおりに機能していません

分類Dev

Jenkins-BitbucketPullリクエストビルダーが期待どおりに機能していません

分類Dev

ブレークポイントが期待どおりに機能していません

分類Dev

jqueryスライダーが期待どおりに機能していません

分類Dev

LaravelまたはWhereHasが期待どおりに機能していません

分類Dev

動的にレンダリングされたマット拡張パネルが意図したとおりに機能していません

分類Dev

XORをマクロとして実装しましたが期待どおりに機能しません

分類Dev

nodejsクライアントを使用するCassandraが期待どおりに機能していません

分類Dev

mod_rewriteリダイレクトが期待どおりに機能しない

分類Dev

react-routerリダイレクトが期待どおりに機能しない

分類Dev

htaccessの301リダイレクトが期待どおりに機能しない

分類Dev

Rubyスクリプトのstderrをリダイレクトしても期待どおりに機能しない

分類Dev

ORDERSQLクエリが期待どおりに機能していません

分類Dev

分割関数を作成しましたが、期待どおりに機能していません

分類Dev

このNSURLリクエストはコンパイルされますが、期待どおりに機能しません。何が足りないのですか?

分類Dev

htmlspecialcharsが期待どおりに機能していません!<を&gt;ではなくgtにしたい

分類Dev

プロトタイプが期待どおりに機能していません

分類Dev

前のページにリダイレクトすると期待どおりに機能しません

分類Dev

forループによって設定されたすべてのsetTimeoutをクリアすると、期待どおりに機能しません

分類Dev

ネストされた角度のあるマテリアルレイアウトでフレックスが期待どおりに機能しない

分類Dev

Flutter:KeyboardType属性がTextFormFieldで期待どおりに機能していませんが、テキストを貼り付けることができます。入力タイプを変更するにはどうすればよいですか?(Flutter)

分類Dev

OrderedParallelが期待どおりに機能していません。(リストをIEnumerableに変換しますか?)

Related 関連記事

  1. 1

    Django; ajaxを使用すると、リダイレクトが期待どおりに機能しません

  2. 2

    CSSを使用した自動インデックス行が期待どおりに機能していません

  3. 3

    Angular出力から連結された文字列が出力され、期待どおりに機能していません

  4. 4

    PHPスクリプトが期待どおりに機能していません

  5. 5

    ELFバイナリのロードされたアドレスを取得します。dlopenが期待どおりに機能しません

  6. 6

    動的に構築された述語が期待どおりに機能していません

  7. 7

    手動で入力する場合、ポーリングはstdinで機能しますが、入力がパイプされてリダイレクトされない場合は機能しません。

  8. 8

    オーバーロードされたDoubleEqual演算子が期待どおりに機能していません

  9. 9

    Jenkins-BitbucketPullリクエストビルダーが期待どおりに機能していません

  10. 10

    ブレークポイントが期待どおりに機能していません

  11. 11

    jqueryスライダーが期待どおりに機能していません

  12. 12

    LaravelまたはWhereHasが期待どおりに機能していません

  13. 13

    動的にレンダリングされたマット拡張パネルが意図したとおりに機能していません

  14. 14

    XORをマクロとして実装しましたが期待どおりに機能しません

  15. 15

    nodejsクライアントを使用するCassandraが期待どおりに機能していません

  16. 16

    mod_rewriteリダイレクトが期待どおりに機能しない

  17. 17

    react-routerリダイレクトが期待どおりに機能しない

  18. 18

    htaccessの301リダイレクトが期待どおりに機能しない

  19. 19

    Rubyスクリプトのstderrをリダイレクトしても期待どおりに機能しない

  20. 20

    ORDERSQLクエリが期待どおりに機能していません

  21. 21

    分割関数を作成しましたが、期待どおりに機能していません

  22. 22

    このNSURLリクエストはコンパイルされますが、期待どおりに機能しません。何が足りないのですか?

  23. 23

    htmlspecialcharsが期待どおりに機能していません!<を&gt;ではなくgtにしたい

  24. 24

    プロトタイプが期待どおりに機能していません

  25. 25

    前のページにリダイレクトすると期待どおりに機能しません

  26. 26

    forループによって設定されたすべてのsetTimeoutをクリアすると、期待どおりに機能しません

  27. 27

    ネストされた角度のあるマテリアルレイアウトでフレックスが期待どおりに機能しない

  28. 28

    Flutter:KeyboardType属性がTextFormFieldで期待どおりに機能していませんが、テキストを貼り付けることができます。入力タイプを変更するにはどうすればよいですか?(Flutter)

  29. 29

    OrderedParallelが期待どおりに機能していません。(リストをIEnumerableに変換しますか?)

ホットタグ

アーカイブ