BashでEOFを可視化する方法

BashでEOFを可視化する方法

/dev/null作成されたすべてのコンテンツを削除してEOF読み取るために使用できる特別なLinuxファイル。

/dev/null私はこれを読書を通して得て視覚化したいと思いましたEOF。私が試した場合:

$ cat /dev/null | hexdump

これはうまくいきません。出力なしでプロンプトに戻ります。EOFASCIIコードでさえないので、そうかもしれません。

  1. それでもEOFキャラクターだと見ることができますか?

  2. EOFBashで提供されている場合、それを検出して印刷する方法はありますかstdin

それは次のとおりです。

$ cat /dev/null | some_tool
EOF

私はUbuntu 20.04.3を使用していますが、解決GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)策がある場合は、これらの特定のバージョンとは無関係であることを願っています。


これはいいえ宿題ですが、もっと学ぶ方法ですEOF

ベストアンサー1

元のASCII制御文字セットで定義された一連の「{something}末尾」文字がありますが、EOFは文字ではありません。 EOF は、入力ストリームから読み取れなくなったため、検出可能な条件です。

たとえば、このループは読み取る内容がなくなるまで(つまり、EOFに達するまで)続きます。

{
  while IFS= read -r line; do
    printf '%s\n' "Read: >> $line <<"
  done
  if [ -n "$line" ]; then
    printf '%s\n' "And some extra data after the last line: >> $line <<"
  fi
  echo 'No more'
}

または、より効率的に(一部の実装ではNULバイトをブロックしないsed)、シェルループを完全に避けてください。

LC_ALL=C sed 's/.*/Read: >> & <</'; echo 'No more'

(最後の行の後にデータがある場合は、No moreその行の接頭辞として使用します。)

端末のデフォルト設定は、キーを^D押すと端末から送信された文字がCtrl D端末ドライバによってEOFを表すと解釈されることです。ただし、その文字(または他の文字)はアプリケーションに送信されません。 tty デバイスファイルの s が読み取る内容を返すようにし、read()何もなければアプリケーションはそれを EOF と解釈します。端末装置の現在のEOF文字)。独自の行エディタを実装するシェルまたは他のアプリケーションは通常、この文字を同じ方法で処理します(少なくとも空行バッファにある場合)。stty -aeof

おすすめ記事