8566


たまに次のようなシェルスクリプトを見かけることがあるのですが、`/dev/null` を入力にする意味を教えてください。

[code]

    cp -i %p /mnt/server/archivedir/%f < /dev/null
    
[/code]


CC BY-SA 4.0
2015-03-30T09:56:08.457
8559
2020-07-31T07:18:43.383
2020-07-31T07:18:43.383
3060
9029
question
linux
/dev/null を入力としたリダイレクトの意味


行全体の意図としては、コピー先にファイルが存在する場合は上書きせずに終了するために `cp -i src dest < /dev/null`
という表現を使っています。

`cp
-i`はコピー先にファイルが存在する場合、標準入力を受け取って、`y`で始まる文字列が入力されれば上書き、それ以外の入力が渡されれば、上書きせずに終了します。

`< /dev/null` は標準入力を `/dev/null`
(すなわち空)に切り替えることによって、端末上の応答を行うこと無しに上書きをしないコピーを実現しています。


CC BY-SA 3.0
2015-03-30T10:31:37.743
8563
2015-03-30T10:31:37.743
344
8559
answer


そのコードを書いた人の真の意図はその人に訊かないとわかりませんけど推測するなら

  * `-i` オプションを付けているので上書きしようとするとプロンプトが出る
  * プロンプトに対する入力を `</dev/null` が抑制し no を入力したことになる

ことから  
「上書きしないときはコピーを実施する（警告なし）」  
「上書きしようとしたらログファイルに警告を残す（コピーはしない）」  
ということであろうと思われるです。

`cp -n` だと上書きしないけどメッセージが残らないので...

あと Linux で採用している GNU coreutils の GNU `cp` でなくて、  
古い unix (ウチにある HPUX11.11 とか) の native `cp` だと  
`-n` が無いものがあり「上書き禁止」を指定できません。  
`-n` が無い場合に上書き禁止するには `-i </dev/null` が古くからあるイディオムです。  
いちいち `test -e` とかするより簡単。


CC BY-SA 3.0
2015-03-30T10:39:53.530
8566
2015-03-31T05:10:10.453
2015-03-31T05:10:10.453
8589
8589
8559
answer