web-dev-qa-db-ja.com

シェルスクリプトで/ dev / nullはどういう意味ですか?

このガイドを使用して、bashスクリプトの学習を開始しました: http://www.tldp.org/LDP/abs/abs-guide.pdf

しかし、私は最初のスクリプトで立ち往生しました:

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Log files cleaned up."

Ubuntuで2行目と3行目は何をしますか(catを理解しています)?他のLinuxディストリビューション専用ですか?このスクリプトをルートとして実行した後、出力されるのはLog files cleaned up.ですが、/var/logにはすべてのファイルが含まれています。

39
rishiag

catcatの後に標準出力に来るファイルの内容をリストし、>はそれをファイルに送信しますmessagesおよびwtmpここで、>は最初を意味しますファイルのすべての内容を削除すると、>>は現在のファイルに追加することを意味します。この場合、>を使用しているため、ファイルは空になります。

キッカーの場合:/dev/nullは、>の後ろの2つのファイルに「何も」送信しないデバイスです。

このような理由があります:ファイルはシステムから削除されません。 rmを実行してからtouch messagesを実行すると、アクセス権が間違っている可能性があり、rmの直後に何かがファイルに書き込みたい場合、エラーが発生します。ソフトウェアの作成方法によっては、クラッシュする可能性があります。

37
Rinzwind

すでに回答したように、これらの2行は/var/log/messagesおよび/var/log/wtmpファイルの内容をクリアするか、または存在しない可能性が低いイベントでそれらを作成しています。

しかし、それらは/dev/null "超常現象"の力を与える確立された都市伝説に基づいています。

実際には何もありませんので、cat /dev/nullはキーストローク、時間、CPUサイクルの無駄であり、まったく何も出力しません。 Eliah Kaganの回答は、代わりにecho -nを使用するより良いアプローチを示唆しています。これは優れていますが、これらのファイルに「-n」文字列を挿入する可能性のある一部のシェル/ OSには移植できません。

さらに進んで、これらのコマンドをポータブルでシンプルなものに置き換えることができます。

cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."

ほとんどのシェル(cshベースのシェルではありません)では、さらに進んでno-opコマンド ':'を削除できます。

cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
12
jlliagre

>は出力リダイレクト演算子です。コマンドの出力を標準出力デバイスの代わりにその後に記載されたファイルにリダイレクトし、ファイルの内容を切り捨てたり上書きしたりします。

たとえば、ls -l > demo.txt。このコマンドを実行すると、「demo.txt」には出力ls -lコマンドが含まれます。

次は、この/dev/null./dev/nullがnullファイルであるかどうかですIsは、何も含まれていない特別なファイルです。

コマンドを実行するとき

cat /dev/null > messages
cat /dev/null > wtmp

eOF(End Of File)文字で上書きすることにより、「メッセージ」および「wtmp」ファイルの内容をクリアします。

したがって、ここでは/var/logディレクトリを消去しませんが、これら2つのファイルの内容は消去します。

5
g_p

/ dev/nullはブラックホールのようなものです。/dev/nullへの書き込みは破棄されます。このスクリプトでは、/ dev/nullを使用してメッセージログファイルを空にします。

そうでなければ、彼らは単に使用することができます。

 > /var/log/messages.

ファイルの内容を空にする他の方法があります。

好む。

     truncate  -s  0  /var/log/messages
     cp  /dev/null  /var/log/messages

ただし、「>」または「/ dev/null」を使用するのが効率的な方法です。