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 8.0 オンライン DDL クイック列追加の概要

目次問題の説明MySQLオンラインDDLで列を追加する従来の方法01 コピー方法02 インプレースメ...

docker cp ファイルをコピーしてコンテナに入る

実行中のコンテナに入る # コンテナに入り、新しいターミナルを開きます# docker exec -...

数十行のjsを使用してクールなキャンバスインタラクティブ効果を実現する方法を教えます

目次1. 円を描く2. マウスで動かした円3. マウスでドラッグした粒子4. カラーグラデーション粒...

Zabbix上のすべてのホストのIPとホスト名を取得する

ザビックスZabbix ([`zæbiks]) は、WEB インターフェースに基づいて分散システム監...

MySQL 5.7 のインストールと設定方法のグラフィックチュートリアル

このチュートリアルでは、MySQL 5.7のインストールと設定方法を参考までに紹介します。具体的な内...

MySQLでよく使われる演算子と関数の概要

まずデータ テーブルを作成しましょう。 使用テスト; テーブル「従業員」を作成します( emp_no...

js メモリ リークのシナリオ、それらを詳細に監視および分析する方法

目次序文どのような状況でメモリリークが発生する可能性がありますか? 1. 偶発的なグローバル変数2....

CSS を使用してマウスをホバーすることで他のタグのスタイルを変更するサンプルコード

序文:私の知る限り、現在 CSS で制御できるのは、タグをホバーしたときにそのタグの下の兄弟タグとサ...

フロントエンド開発に必要な共通ツール機能のまとめ

1. 時刻の書式設定とその他の方法moment.jsライブラリファイルの使用をお勧めします2. テン...

Web インタビュー: MVC と MVVM の違いと、Vue が MVVM に完全に準拠していない理由

目次MVCとMVVMの違い前述のMVCC の概要長所と短所MVVM概要MVVM 実装者 — Vue ...

HTML チュートリアル: 順序なしリスト

<br />原文: http://andymao.com/andy/post/102.h...

js オプション連鎖演算子の使用

序文オプションの連鎖演算子 (?.) を使用すると、チェーン内の各参照が有効であることを明示的に検証...

CSS を使用して 3 列レイアウトを実装するサンプル コード。中央の列は適応型で、テキスト サイズに応じて幅が変わります。

Baiduのインタビューで遭遇する質問は、次のレイアウト効果を達成する必要がある。 中央の紫色の列...

CSS モジュールソリューション

CSS のモジュール ソリューションは、JS のモジュール ソリューションと同じくらい多く存在すると...