Linuxシステムにおける仮想デバイスファイルのさまざまな実用的な使用法の詳細な説明

Linuxシステムにおける仮想デバイスファイルのさまざまな実用的な使用法の詳細な説明

みなさんこんにちは。私は梁旭です。

ご存知のとおり、Linux ではデバイス ファイルも含めすべてがファイルです。仕事の過程で/dev/nullをよく見かけますが、これは何でしょうか?

技術的に言えば、 /dev/nullは仮想デバイス ファイルです。プログラムでは、これらの仮想デバイス ファイルは実際のファイルとして扱われます。プログラムはこのデータ ソースからデータを要求することができ、結果のデータはオペレーティング システムによって提供されます。ただし、このデータはディスクから読み取られるのではなく、オペレーティング システムによって動的に生成されます。仮想デバイス ファイルの典型的な例は/dev/zeroです。

ただし、 /dev/nullにデータを書き込む場合、 /dev/nullに書き込んだデータは、ブラックホールに投げ込まれたのと同じように、最終的には破棄されます。

この場合、 /dev/nullは何の役に立つのでしょうか?この問題を理解するには、まず Linux システムまたは Unix および Unix 系システムの標準出力と標準エラー出力について基本的な理解が必要です。

標準出力ファイルと標準エラー出力ファイル

コマンドライン プログラムは、標準出力と標準エラー出力の 2 種類の出力を生成できます。標準出力は標準出力ファイル stdout に記録され、標準エラー出力は標準エラー出力ファイル stderr に記録されます。

デフォルトでは、標準出力ファイルと標準エラー ファイルはターミナル ウィンドウ (またはコンソール) に関連付けられます。つまり、標準出力または標準エラーに送信されたものはすべて画面に表示されます。

ただし、シェルでのリダイレクトを通じて、この動作を変更することができます。たとえば、標準出力をファイルにリダイレクトできます。この方法では、標準出力情報は画面に表示されず、後で表示できるようにそのファイルに保存されるか、標準出力情報をデジタル LED や LCD ディスプレイなどの別の物理デバイスにリダイレクトすることができます。

一般的なリダイレクト方法は次のとおりです。

  • 2>を使用すると、標準エラー出力をリダイレクトできます。たとえば、 2>/dev/nullまたは2>/home/user/error.logです。
  • 1>を使用すると標準出力をリダイレクトできます。
  • &>を使用すると、標準エラーと標準出力の両方をリダイレクトできます。

不要な出力をクリアするには/dev/nullを使用する

出力には標準出力と標準エラー出力の 2 種類があるため、 /dev/nullの最初の使用法は、1 種類の出力をフィルタリングすることです。上記の使用法は、次の実際の例を見るとより簡単に理解できます。

/sysフォルダーの下のファイル名にpowerという文字列が含まれるファイルを探して、電源設定に関連するファイルを検索する場合は、次のようにコマンドを記述します。

$ grep -r 電源 /sys/

/sysフォルダには非ルートユーザーがアクセスできないファイルが多数あるため、多くのPermission deniedエラーが発生し、画面に出力されます。

これらのエラー メッセージにより画面が乱雑になり、重要な情報が消えてしまう可能性があります。 Permission deniedエラー メッセージは標準エラー出力の一部であるため、 /dev/nullにリダイレクトできます。

$ grep -r 電源 /sys/ 2>/dev/null

この方法により、表示される情報がより明確になります。

場合によっては、標準出力の内容ではなく、標準エラーの内容を表示したいことがあります。その場合は、標準出力を/dev/nullにリダイレクトできます。

$ ping baidu.com 1>/dev/null

上記のスクリーンショットは、出力をリダイレクトせずに、パケットが宛先ホストに到達できる場合に ping コマンドが通常の出力を表示することを示しています。最初のコマンドについては、ネットワークが接続されているときは画面に何も表示されませんが、ターゲットマシンから切断されると、画面にはエラーメッセージのみが表示されます。
もちろん、標準出力と標準エラー出力を 2 つの異なるファイルにリダイレクトすることもできます。

$ ping baidu.com 1>/dev/null 2>error.log

この例では、標準出力は表示されず、エラー メッセージはerror.logというファイルに保存されます。

すべての出力を/dev/nullにリダイレクトする

場合によっては、出力を表示したくないことがありますが、そのためには 2 つの方法があります。

$ grep -r 電源 /sys/ >/dev/null 2>&1

文字列>/dev/null將標準輸出重定向到/dev/null 中を意味し、2 番目の部分2>&1は標準エラーを標準出力ファイルにリダイレクトすることを意味します。ここでは、単に1と書くのではなく、標準出力ファイル&1書く必要があります。 2>1と記述すると、標準出力は1という名前のファイルにのみリダイレクトされます。

ここで注目すべき重要な点は、順序も非常に重要であるということです。リダイレクトパラメータを次のように入れ替えると、

$ grep -r 電源 /sys/ 2>&1 >/dev/null

期待通りには動作しません。これは、 2>&1最初にインタープリターによって解釈されると、標準エラー出力がデフォルトの標準出力ファイルstdoutにリダイレクトされ、画面に表示されるためです。次に、標準出力が/dev/nullにリダイレクトされると、標準出力情報がクリアされます。最終結果として、画面にエラー メッセージが表示されます。正しい順序を忘れてしまった場合は、もっと簡単な方法があります:

$ grep -r 電源 /sys/ &>/dev/null

この例では、 &>/dev/null重定向標準輸出與標準錯誤輸出到/dev/nullことと同じです。

出力を/dev/nullにリダイレクトするその他の実用的な例

ディスクが連続データを読み取る速度を知りたい場合は、 ddコマンドを使用してテストできます。ただし、 ddコマンドは標準出力ファイルに出力するか、ファイルへの出力を指定します。書き込まれたデータが結果に与える影響を排除するために、 of=/dev/nullパラメータを使用して、 dd出力を実際のディスクではなくこの仮想ファイルに書き込むことができるようにします。ここでこれを行うには、シェルのリダイレクトを使用する必要さえありません。

次のコマンドでは、パラメータif=入力用のファイル名を指定し、パラメータof=は出力用のファイル名、つまり出力が書き込まれる場所を指定します。

次のテストはあまり正確ではありませんが、問題を説明するには十分です。

$ dd if=debian-disk.qcow2 of=/dev/null ステータス=進行状況 bs=1M iflag=直接

上記は実際のシナリオです。ここに別のシナリオがあります。

ある時点で、特定のサーバーから何かをダウンロードできる速度を知りたいと思うことがあるかもしれません。しかし、ディスクに不要なものを書き込みたくないので、この時点では、内容を/dev/nullに書き込むことができます。

$ wget -O /dev/null http://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso

結論は

この記事では/dev/nullファイルのいくつかの実用的な使用法を紹介します。皆さんの作業に役立つことを願っています。この特殊なデバイス ファイルのその他の興味深い使用方法をご存知ですか?メッセージを残してください!

Linux システムにおける仮想デバイス ファイルのさまざまな実用的な使用法に関するこの記事はこれで終わりです。Linux 仮想デバイス ファイルの使用法に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linux で AIDE に基づいてファイルシステムの整合性を検出する方法
  • Linux システムで Vim を使用してリモート ファイルを読み書きするコマンドの詳細な説明
  • Linux で実行可能ファイルを実行するときに「そのようなファイルまたはディレクトリはありません」というプロンプトが表示される場合の解決策
  • Linuxで大きなファイルを素早くコピーする方法
  • Linuxファイル削除後にスペースが解放されない問題の詳しい説明
  • Linux ファイル管理コマンド例の分析 [表示、閲覧、統計など]
  • Linux でのファイル コンテンツの重複排除と交差と差異の実装

<<:  xshellリモート接続の自動切断の問題の解決方法の詳細な説明

>>:  MySQL エンコーディング utf8 および utf8mb4 utf8mb4_unicode_ci および utf8mb4_general_ci

推薦する

CSS スタイルをプログラムで処理するためのサンプル コード

プログラム的アプローチの利点1. スタイルの分散を避けるためのグローバルコントロール2. シンプルな...

開発をスピードアップできる VueUse ライブラリ 5 つ (まとめ)

目次VueUse にはどのようなユーティリティがありますか? VueUseをVueプロジェクトにイン...

Tomcat と WebLogic で純粋な HTML ファイルを展開するプロセスの分析

1. まず、純粋なHTMLファイルにはindex.htmlというエントリが必要です。 2. Tomc...

http-proxy-middlewareを使用してNodeでプロキシクロスドメインを実装する方法と手順

目次1. プロキシモジュールをインストールする2. プロキシを設定する1. プロキシモジュールをイン...

Vue フロントエンドで PDF を生成してダウンロードする方法

目次1. インストールと導入2. PDFファイルをパッケージ化してエクスポートする方法構成の詳細PD...

CocosCreator で物理エンジン ジョイントを使用する方法

目次マウスジョイント マウスジョイント距離ジョイント距離ジョイントモータージョイント直動ジョイント変...

CSS3 で transform を使用した場合のフォントぼかしの解決方法の詳細な説明

この質問は非常に奇妙なので、あまり多くを語らずにコードに直接進みます。 .g-ダイアログラッパー{ ...

Linux でネットワーク パケット損失と遅延をシミュレートする方法

netem と tc: netem は、Linux カーネル バージョン 2.6 以降で提供されるネ...

MySQLデータベースのストアドプロシージャとトランザクションの違い

トランザクションは、複数の SQL ステートメントの原子性、つまり、それらが一緒に完了するか、一緒に...

Linuxでディスク使用量を確認する方法

1. dfコマンドを使用してディスク全体の使用量を表示します。 df コマンドは、ハードディスクのマ...

Vueのprovideとinjectの使い方と原則を分析する

まず、provide/inject を使用する理由について説明しましょう。祖父コンポーネントと孫コン...

Tomcat 7.0 で仮想ディレクトリを設定し、仮想パスを構成する方法

Tomcat7.0は仮想ディレクトリを設定します(1)現在、当社のウェブサイトはデフォルトのディレク...

docker での psql データベースのバックアップとリカバリの詳細な説明

1. DockerでのPostgresデータベースのバックアップ注文: docker exec it...

nginx をベースにリロードなしでアップストリーム サーバーの動的な自動起動と停止を実装する方法

目次1. Consulクラスタをデプロイする1. 準備3. Consulクラスタを作成する4. 管理...

MYSQLパターンマッチングREGEXPの使用に関する一般的な話など

のようにLIKE ではデータ全体が一致する必要がありますが、REGEXP では部分的な一致のみが必要...