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

推薦する

MySQLエラー10061を解決する方法

この記事では、「'localhost' (10061) の MySQL サーバーに接...

Vueバインディングクラスとバインディングインラインスタイルの実装方法

目次バインディングクラスインラインスタイルのバインディングバインディングクラス方法1:オブジェクト構...

docker で nginx+php+mysql を設定する方法

まず、方法を理解します。 docker exec を使用して Docker コンテナに入るDocke...

XHTML 入門チュートリアル: XHTML ハイパーリンク

ハイパーリンクはインターネット全体を接続していると言っても過言ではありません。ハイパーリンクは、別の...

CocosCreatorでリストを作成する方法

CocosCreator バージョン: 2.3.4 Cocos には List コンポーネントがない...

JavaScript サンドボックスの探索

目次1. シナリオ2. サンドボックスの基本機能3. iframeの実装4. Webワーカーの実装5...

テーブルの最大幅と最小幅を設定する際の互換性の問題と解決策の詳細な説明

テーブル内の min-width と max-width プロパティの設定 <テーブル>...

丸い角や鋭い角を表現するために、絵の代わりに文字を使用する研究

Google Gmail ページから撮った次のスクリーンショットをご覧ください (同じ場所からスクリ...

Nginx 急ぎ購入 電流制限構成 実装分析

ビジネス上のニーズにより、急ぎの購入が発生することが多いため、ロード バランシング フロント エンド...

MySQL GROUP_CONCAT 制限の解決

効果: GROUP_CONCAT関数は、フィールド値を文字列に連結することができます。デフォルトの区...

docker を使用して Django テクノロジー スタック プロジェクトをデプロイする方法

Docker の人気と成熟に伴い、Docker は徐々にプロジェクトをデプロイするための第一の選択肢...

Tomcat プロセスの CPU 使用率が高い場合の解決策

目次場合コンテキスト切り替えのオーバーヘッド?要約するCPU は多くの場合、システム パフォーマンス...

vue3.0 sfcのセットアップの変更について簡単に説明します。

目次序文標準的なSFCの書き方スクリプト設定可変露出部品の取り付け小道具カスタムイベント要約する序文...

CSS 変数に基づくテーマ切り替えに最適なソリューション (推奨)

この要件を受け取ったとき、Baidu は、CSS リンクの置き換え、className の変更、le...

WeChatアプレットはキャンバスを使用して時計を描画します

この記事では、キャンバスを使用してWeChatアプレットに時計を描く具体的なコードを参考までに共有し...