/dev を調べていたところ、 を含むいくつかのファイルを見つけましたnull
。 ファイルに何が含まれているか確認したかったので を実行しましたhx null
が、何も起こらず、 というエラーが表示されましたFile null is not a regular file
。 このメッセージの原因は何ですか?
答え1
いくつかのオブジェクト/dev
は疑似デバイスカーネル関数によって直接処理されます。よく使用されるものは次のとおりです。
/dev/null
: 無限の容量を持つユニバーサルシンク。出力を破棄するために使用されます: tryecho foo >/dev/null
。そこから読み取ると、空のバイトストリーム (即時 EOF) が返されます。/dev/zero
: 無限のバイトのソース0x00
。多くの場合、0 で上書きするための入力として使用されます。/dev/random
、/dev/urandom
: ランダムバイトの無限のソース。
答え2
実際、他の回答はどれも、なぜ hx が /dev/null で動作しないのかという疑問に実際に答えていないようです。hx がこのように反応する理由は、単にデバイス ファイルに対してこのエラー メッセージを出力するようにプログラムされているからです。
からhttps://github.com/krpors/hx/blob/develop/editor.c#L125 翻訳元::
if (!S_ISREG(statbuf.st_mode)) {
fprintf(stderr, "File '%s' is not a regular file\n", filename);
exit(1);
つまり、hx は通常のファイル以外のファイルでは動作しないことを明確に拒否します。このチェックにはあまり良い理由があるとは思いません。このチェックがなければ、/dev/null
hx は空のファイルを読み取り、そのファイルに対する更新は保存時に失われるという意味で、hx で動作すると予想されます。
(これはhttps://github.com/krpors/hx/ よりこれはまさにポスターが語っているhxプログラムです)
答え3
/dev/null
基本的には情報を破棄する方法です。
主な目的は、単に物事を忘却へとリダイレクトできるようにすることです。
echo 'duck' > /dev/null
によって提供されたメッセージは、echo 'duck'
送信される際に抑制され/dev/null
、破棄されます。
これは主に、表示したくない出力を返すコマンドを使用するときに使用されます。
読み取ると/dev/null
すぐにファイルの終わりが返されます。つまり、空のファイルのように動作します。
/dev
他にも、ランダムなデータを提供する面白い機能がありますrandom
。これは、実際には「ファイル」から期待されるものではありません :) 注目すべき点は、これは/dev/random
システムの使用状況 (キーストローク間の時間など) から収集された真のランダム データであり、そのプールはかなり早く使い果たされる可能性があるということです。/dev/urandom
ランダムな数値のように見えますが、数式によって計算されます。通常は/dev/urandom
ニーズには十分ですが、たとえば非常に強力な暗号キーの場合は十分ではありません。
から読み取って/dev/zero
、ゼロ (null) バイトの無限ストリームを取得することもできます。
答え4
/dev/null
文字デバイス ファイル、つまりデバイス ドライバーへのインターフェイスです。
この特定のデバイスはダミー デバイスです (実際のハードウェアを表すものではありません)。これは、ディスプレイやその他の場所に表示したくないプログラムの出力をダンプできる、底なしのゴミ箱として特別に作られています。
- 内容的には、実際に読むこのファイル (そう、あなたできるそれを読んで)、それはいつも長さ0バイトの空のファイルと同等である。
あなたのコマンドが何なのか分かりませんhx
が、あなたの説明から推測すると、それはファイルの種類を識別するコマンドだったと思います。内容によってこのタスクのために GNU/Linux システムで使用するコマンドは でありfile
、ファイルが通常のファイルではないことがわかった場合は、これも停止します...
$ file /dev/null
/dev/null: character special
しかし、file
コマンドには-s
、関係なく強制的に読み取るオプションも用意されています...
$ file -s /dev/null
/dev/null: empty
おそらく、あなたのhx
コマンドには、使用できる同様のオプションがあるでしょうか?
file
デフォルトでは(おそらくあなたのhx
コマンドも)非正規ファイルを識別しない理由は、-s
オプションのドキュメントにヒントがあります。file
のマニュアルページつまり...
- これらのファイルを読み取ると副作用が発生する可能性がありますが、その副作用は望ましくない場合もあります。
- FIFO パイプから読み取ると、パイプ内のデータが永続的に消費されるため、読み取ったデータをパイプに戻すことはできません。
- デバイス ファイルから読み取るとデバイスが変更されます...
- テープ デバイスから読み取ると、テープ ヘッドの位置がずれます。
- シリアル ポート デバイスから読み取ると、バッファリングされた入力バイトが消費されます。
- 乱数デバイスから読み取ると、システムのエントロピー プールが枯渇します。
- 問題のデバイスのドライバーに応じて、さらに多くのものがあります。
- これらの特別なファイルを識別するコンテンツ別はるかに多くの作業が必要で、確実性もはるかに低い:
- コンテンツのサイズは事前にわかりません (または
ioctl()
取得するには特別なシステム固有の呼び出しが必要です)。 - 多くの場合、検索は機能しません。
- ファイル末尾の署名に依存するファイル タイプを検出するには、ファイル全体を読み取る必要があります。
- これらのファイルの中には無限コンテンツ。
- コンテンツのサイズは事前にわかりません (または
プログラムが必要な作業を処理するように設計されていない場合、非正規のファイルの内容を識別できず、安全上の予防措置として中止される可能性があります。
- この安全チェックを行わずにプログラムを進めた場合、下がる、クラッシュ、あるいは最悪の場合、システムがメモリ不足; 問題のプログラムの設計によって異なります。
この場合は、プログラムの制限です。file -s
代わりに識別目的で使用してください。
補遺
もしあなたhx
がある種の16進数/2進数編集者;それは特にお勧めできません知らない特別なファイルを開くために使用します。16進数編集者通常はプリロードファイル全体編集操作のためにメモリに保存します。
/dev/zero
このため、無限コンテンツデバイスファイル(またはなど/dev/urandom
)や、大きな有限デバイス(など)を開こうとすると/dev/sda
、システムがメモリ不足状態回復するにはマシン全体をリセットする必要がある場合があります。
先ほど実行した安全チェックは、おそらくそのような状況からあなたを守るために行われているのでしょう。(すでに述べたように、デバイス ファイルのコンテンツ サイズは事前にはわかりません。つまり、プログラムでは、デバイス ファイルを読み込むのに十分なメモリがあるかどうかを事前に判断できません)
とにかくファイルのヘッダーを「覗き見」したいだけの場合、16進数を使用する視聴者その代わり、 のようにhexdump
(推奨)、または昔ながらのod
。 例えば:
hexdump -C -n 512 /dev/null
(内容は空になります)hexdump -C -n 512 /dev/urandom
(内容は毎回違う意味不明な内容になります)
^ この-n 512
オプションは、表示を最初の 512 バイトに制限します。ただし、これを省略して、無限の出力に襲われた場合でも、それを止めるには を押すだけで済みますCtrl+C。