/dev/null
に関するウィキペディアの記事 を読み、ファイルを/dev/null
に移動して遊んでいました。
このためにtest_file
を作成し、その中にいくつかのコンテンツを入れました:
$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya
その後、ファイルを/dev/null
に移動しようとしました:
$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied
以来、これによりPermission denied
エラーが発生しました。先に進み、Permission denied
エラーが発生したときはいつものようにSudo
を使用しました。
$ Sudo mv test_file /dev/null
コマンドは成功し、test_file
はディレクトリに存在しなくなりました。
ただし、Wikipediaの記事には、/dev/null
に移動したものを復元することは不可能であり、そこから読み取ろうとするプロセスにEOF
が与えられると書かれています。しかし、私は/dev/null
から読むことができます:
$ cat /dev/null
This is written by Aditya
何を間違えたのか、/dev/null
を通常に戻すにはどうすればよいですかそもそもなぜPermission denied
エラーに遭遇したのですか?
/dev/null
はファイルです。特別なファイル。システムのハードウェアと通信する/ dev/sdaや/ dev/ttyなどのデバイスファイル。
/dev/null
との唯一の違いは、ハードウェアがリンクされていないことです。送信したデータはすべて静かに破棄されます。次のコマンドのように:
echo "Hello World" > /dev/null
echo
の出力をnullに送信するため、端末には何も印刷されません。
ただし、mv test_file /dev/null
を実行したときは、/dev/null
の内容のコピーを保持して、特殊ファイルtest_file
を通常のテキストファイルに置き換えました。つまり、あなたは/dev/null
を失いました。
今、あなたがしなければならないことは(それを再構築するため)です:
Sudo rm /dev/null
Sudo mknod -m 0666 /dev/null c 1 3
多くのスクリプトがデフォルトで/dev/null
に出力を送信するため、再構築する必要があります。 /dev/null
がブラックホールではなく通常のテキストファイルである場合、ファイルシステムが大きくなり、大きくなり、いっぱいになる可能性があります。そして、あなたはこれを避けたいと確信しています。
さらに危険なのは、多くのスクリプトが/dev/null
からの読み取りは何も読み取らないと想定していることです。この仮定を破ると、システム全体のファイルにランダムなゴミが書き込まれる可能性があります。修正するのは事実上不可能です。
Linuxはマルチタスクであることを忘れないでください。/dev/null
で遊んでいる間、多くのプロセスが実行されており、数秒の「機会の窓」でも大混乱を引き起こす可能性があります。
/dev/null
で遊びたい場合は、コピーを作成して試してください:
Sudo mknod -m 0666 /tmp/null c 1 3
/tmp/null
とまったく同じように機能する/dev/null
ファイルを作成しますが、システムを危険にさらすことなく操作およびテストできます。
ファイルの上書きとファイルへの書き込みには大きな違いがあります。
何かを/dev/null
に書き込むとき、例えば
$ echo Hello > /dev/null
...静かに破棄されます。このためには、誰もが持っている/dev/null
への書き込み権限が必要です。
$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null
mv
コマンドで行ったように/dev/null
をoverwriteすると、特別なファイル/dev/null
をそこに移動したもので置き換えます。 これをしないでください!ルート権限が必要な理由は、ファイルを上書きするには、ファイルを含むディレクトリへの書き込み権限が必要だからです 、この場合は/dev
:
$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev
/dev/null
を復元するには、コマンドを発行します
$ Sudo rm /dev/null
$ Sudo mknod -m 0666 /dev/null c 1 3
( &L StackExchange:/dev/null
の作成方法 も参照してください)
コマンドを実行するとき
$ Sudo mv test_file /dev/null
replaced特殊ファイル/dev/null
がテキストファイルに含まれています。 /dev/null
から読み取ろうとすると、テキストファイルの内容が返され、通常の方法で/dev/null
を使用しようとするプログラムはおそらく壊れます。
/dev/
のデバイスファイルの置換または削除にはスーパーユーザー権限が必要です。これが、Sudo以外の試みがエラーで失敗した理由です。
/dev/null
を手動で復元する方法については、Benoitの回答を参照してください。ただし、/dev/
のコンテンツのほとんど(すべてではないにしても)はudevによって動的に管理されるため、単純な再起動でもおそらく修正されると思われます。
何をすべきかという質問に答え、ファイルを削除するには、次のようにします。
rm test_file
他の人が述べたように、/ dev/nullはプログラムの出力先です。