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

推薦する

jsオブジェクト指向カプセル化カスケードドロップダウンメニューリストの実装手順

この例で開発されたカスケード ドロップダウン メニューは、既存の JSON データに基づいて作成され...

CSS で垂直方向の中央揃えを実装するいくつかの方法の概要

フロントエンドのレイアウト プロセスでは、水平方向の中央揃えを実現するのは比較的簡単で、通常は ma...

Vueは買い物数量を変更できるショッピングカートを実装します

この記事では、Vueを使用してショッピングカートの数量を変更する方法を紹介します。具体的な内容は次の...

MySQLトリガーの例の詳細な説明

目次トリガーとは何かトリガーを作成する複数の実行ステートメントを持つトリガーの作成制限と考慮事項要約...

MySQL マルチインスタンス インストール ブート自動起動サービス設定プロセス

1.MySQLの複数インスタンスMySQL マルチインスタンスとは、1 台以上のマシン上で複数の M...

HTMLページをクリックしてダウンロードファイルを実装する2つの方法

1. <a>タグを使用して完了します <a href="/user/te...

SQL文のANDとORの実行順序で発生する問題

質問昨日、データベースSQLを書いているときに問題が発生しました。問題の根本は、SQL ステートメン...

MySQL での utf8mb4 照合の例

MySQL における一般的な utf8mb4 ソート規則は次のとおりです。 utf8mb4_0900...

MySQL の DDL と DML についての簡単な説明

目次序文1. DDL 1.1 データベース操作1.2 データテーブルの操作1.3 一般的なデータ型1...

1時間で学ぶMySQLの基礎

目次MySQL を使い始めるMySQL 管理6. MySQL サーバーを起動および停止します。 7....

MySQLデータベース移行におけるデータ文字化けの問題を解決する

リーダーの指示のもと、Java プロジェクトを引き継ぎ、リファクタリングを行う必要がありました。同時...

docker ポートを追加して dockerfile を取得する方法

DockerイメージからDockerfileを取得する docker 履歴 --format {{....

Dockerでイメージ情報を表示する方法

この記事では、Dockerでイメージ情報を表示する方法を学ぶ必要があります。 1. imagesコマ...

CSS3 で QR コードスキャン効果を実装する例

オンラインプレビューhttps://jsrun.pro/AafKp/まず効果を見てみましょう:最初の...