10

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

cp -i %p /mnt/server/archivedir/%f < /dev/null
cubick
  • 20,987
  • 5
  • 25
  • 64
user218669
  • 147
  • 2
  • 10

2 Answers2

11

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

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

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

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

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

774RR
  • 21,855
  • 19
  • 44
  • ご回答いただきまして、ありがとうございます。GNU cp以外でも上書きをしないコピーを実現するために使われているんですね。ありがとうございました。 – user218669 Apr 01 '15 at 07:20
2

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

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

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

k12u
  • 21
  • 2
  • ご回答いただきまして、ありがとうございます。 -iオプションで入力を受付るようになっていることに気が付きませんでした。 < /dev/nullで何も入力しないでエンターキーを押下したことに相当するんですね。 ありがとうございました。 – user218669 Apr 01 '15 at 07:14