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

推薦する

Vue で Google サードパーティ ログインを実装するためのサンプル コード

目次1. 開発者プラットフォームの構成問題を解決する1. 開発者プラットフォームの構成1. 開発者プ...

Dockerコンテナが停止できない問題の解決方法

解決策は次のとおりです。 1. コンテナを強制削除する docker rm -f ジェンキンス2. ...

MySQL 最適化 Zabbix パーティション最適化

zabbix を利用する上での最大のボトルネックはデータベースです。zabbix のデータストレージ...

VirtualBox CentOS7.7.1908 Python3.8 ビルド Scrapy 開発環境 [グラフィックチュートリアル]

目次環境CentOSをインストールするyum 国内ミラーソースを構成するサードパーティの依存関係をイ...

Vue の詳細な入門ノート

目次1. はじめに2. 初期ビュー(I) Vueの概念を理解する(II) MVVMアーキテクチャ(I...

MySQLデータベースの共通操作スキルのまとめ

この記事では、MySQL データベースの一般的な操作テクニックをまとめます。ご参考までに、詳細は以下...

JavaScript は最大値と最小値のアルゴリズムを通じて AI 三目並べゲームを実装します

では、早速スクリーンショットを実行してみましょう。黒い駒はプレイヤーの位置、赤い駒はコンピュータの位...

GitHub のサードパーティ認証方式を Vue で実装する例

目次OAuth アプリの作成コードを取得するaccess_tokenを取得するユーザー情報を取得する...

Vue は無限ロードウォーターフォールフローを実装します

この記事では、参考までに、無限ロードウォーターフォールフローを実現するためのVueの具体的なコードを...

LinuxサーバーにGRUBをインストールする手順

Linux サーバーに GRUB をインストールする方法クラウド移行ツールを使用して、CentOS ...

bash を使って日付をカウントダウンする方法

重要なイベントまであと何日あるか知りたいですか? Linux bash と date コマンドが役に...

MySQL と接続関連のタイムアウトの詳細な概要

MySQL と接続関連のタイムアウト序文:今日、同僚から、データ量が多いときに MySQL データベ...

JavaScript にはすでに Object があるのに、なぜ Map が必要なのでしょうか?

目次1. オブジェクトをマップとして扱わない1. 未定義のプロパティはプロトタイプチェーンを通じてア...

Javascriptはセキュリティ検証に整合性属性を使用します

目次1. スクリプトタグを使用してファイルをインポートする1. ローカルファイルをインポートする2....

Docker-Composeコマンドの使い方の詳しい説明

Docker コンテナはさまざまな方法で管理およびデプロイできます。 Docker コマンドを直接使...