test_dir
ディレクトリを/dev/null
に移動しようとすると、メッセージが表示されます
mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’
では、なぜ「Sudo mv ~ /dev/null
コマンドを実行しないでください。ホームディレクトリを穴に移動しますか?」と言うのはなぜですか?
ただし、/home
もディレクトリです。
人々が仮定するため。私はそれらの人々の一人でした テストするまで 。人々が仮定する理由を理解するのは簡単です...それlooks危険...
...しかし、あなたは実際に/dev/null
に物事を移動することはできません—それは単にリダイレクトを吸収する(そしてそれらを無に送る)特別なファイルです。ディレクトリをそのディレクトリに移動しようとすると、ファイルシステムが顔面で爆発的に爆発し、ファイルをそのディレクトリに移動しようとすると、おそらくファイルが置き換えられてしまいます。
最初のリンクはディレクトリを扱いますが、ファイルで上書きするための別のテストがあります。 Rmanoがコメントで指摘しているように、これはおそらく大人の監督なしにすべきではないことです。リスクが伴います。
$ echo "this is my file" > test
$ cat test
this is my file
$ Sudo mv test /dev/null
$ cat /dev/null
this is my file
# Fix this!
$ Sudo rm /dev/null
$ Sudo mknod -m 0666 /dev/null c 1 3
/dev/null
は単なるファイルであり、「特殊文字」ファイルですが、ファイルが従わなければならない規則によって束縛されることは少なくありません。このコマンドを実行することは決してできないと言われています:
$ mv ~ /dev/null
mv
コマンドは、ディレクトリをファイルに移動するため、これを許可しません。これは、コンテキスト的に意味をなさないだけで、mv
はこれを知っています。
$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’
通常のファイルをコピーしようとすると、それが文字ファイルである場合、/dev/null
にもコピーできません。
$ cp ~/bzip2_1.0.6-4_AMD64.deb /dev/null
$ ls -l |grep null
crw-rw-rw- 1 root root 1, 3 Mar 16 14:25 null
このファイルに対してできる唯一のことは、mv
を別のファイルにコピーするか、削除することです。
$ mv /path/to/afile /dev/null
このコマンドの後、/dev/null
は通常のファイルです。この変更の最も危険な影響は、/dev/null
がneverにデータを出力することになっているため、多くのシェルスクリプトが
`... < /dev/null`
「何もない」と言うのと同じです。この仮定を破ると、ランダムなデータ(最後のプロセスが `/ dev/null 'に書き込んだデータ)がシステム全体のシステムファイルに挿入される可能性があります。
ファイルやその他の入力ストリームを/dev/null
に書き込むことはできますが、ディレクトリに書き込むことはできません。 /dev/null
はディレクトリではなくファイルであるため、ディレクトリを/dev/null
に移動しようとするとエラーが報告されます。
ただし、/dev/null
を試してみたいので、最初にファイルを移動して/dev/null
を上書きした場合の結果と、その状況から回復する方法を知っておくことをお勧めします。
@ Rmano in この回答 で示唆されているように、/dev/null
を試すには、コピーを作成してから実験を行う必要があります。それでは、/tmp/null
を作成して、実験目的で使用してみましょう。
Sudo mknod -m 0666 /tmp/null c 1 3
今後は、/tmp/null
がすべての目的のための/dev/null
です:
test_file
というディレクトリ内にtest_dir
とask_ubuntu
を作成しましょう。
$ mkdir ask_ubuntu
$ cd ask_ubuntu
$ touch test_file
$ mkdir test_dir
$ echo "Let us test if we can recover our test_file." > test_file
以下は、ask_ubuntu
ディレクトリの内容を示しています。
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:10 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
-rw-r--r-- 1 aditya aditya 0 Mar 18 17:10 test_file
test_file
を/tmp/null
に移動して、ask_ubuntu
の内容を確認してください。
$ Sudo mv test_file /tmp/null # This succeeds
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
コマンドは成功し、test_file
は使用できなくなります。 test_dir
を/tmp/null
に移動してみてください。成功しません:
$ Sudo mv test_dir/ /tmp/null
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’
test_dir
はask_ubuntu
内にまだ存在しています:
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
次に、test_file
から/tmp/null
を復元できるかどうかを考えてみましょう。
$ cat /tmp/null
Let us test if we can recover our test_file.
したがって、それはまだ存在し、/tmp/null
は特別なファイルでしたが上書きされ、他の通常のファイルのようになりました。他のファイルと同様に/tmp/null
をコピーすることでファイルを回復できます。
$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.
ファイルが回復しました。
/tmp/null
を作成せず、/dev/null
を使用してこれらのコマンドを直接試した場合cp /dev/null our_test_file
を実行して、必要に応じてファイルを回復してください。リンクされた質問に記載されている次のコマンドをできるだけ早く実行して、システムに存在する目的で/dev/null
を復元します。
$ Sudo rm /dev/null
$ Sudo mknod /dev/null c 1 3
$ Sudo chmod 666 /dev/null
そのため、ディレクトリを/dev/null
に移動することは不可能であるため、そこからディレクトリを回復することに疑問の余地はありません。
ファイルに関する限り、ファイルを/dev/null
に直接移動しても、上記のようにファイルを回復できます。ただし、次の2つの例外があります。
期間中にSudo mv test_file /dev/null
およびcp /dev/null our_test_file
を実行します。システム内のルートスクリプトがecho "Whatever text the root script wants to send to /dev/null" > /dev/null
(または他の同様のコマンド)を実行してそれを上書きする場合。その場合、ファイルを回復する簡単な方法はありません。
これらの2つのコマンドを実行する間にシステムを再起動する場合。 /dev/null
はブート時に再作成されるため、コンピューターをシャットダウンするとファイルが失われます。
しかし、echo "Stream this line to /dev/null" > /dev/null
のような入力ストリームを回復したい場合、/dev/null
は不要なファイルと入力ストリームを破棄する特別なファイルであり、Wikipediaの記事で言及されているように、それから読み取るプロセスへのデータ。
/dev/null
に送信されたものはすべて静かに破棄されます。入力した場合:
echo "Hello World"
画面にHello World
が表示されます。入力した場合:
echo "Hello World" >/dev/null
画面には何も表示されません。
しかし、moveコマンドの場合、コマンドmv
は、/ dev/nullファイルをディレクトリで置き換えようとしますが、これは不可能です。 Linuxではすべてがファイルであるため、/ dev/nullはファイルです。もちろん特別なもの(デバイスファイル)、ハードウェア(ディスク、パーティション、サウンドカード、シリアルポートなど)にアクセスできる特別なファイル。/dev/nullの場合、これはどのハードウェアにもリンクされていないため、送信されたデータは静かに破棄されます。これが「彼ら」がそれをブラックホールと呼んだ理由です。