42

bash では、標準 (1) およびエラー (2) の出力を次のように再ルーティングして破棄できます。

>/dev/null 2>&1

しかし、次の例では何かが異なります。

nohup myscript.sh >myscript.log 2>&1 </dev/null &

</dev/null上記の例の意味/機能は何ですか? どのような種類のスクリプト シナリオで役立ちますか?

(ソース例)


自作パスワードプロンプト

こんにちは、Ruby on Rails を実行するように Mac をセットアップしようとしていますが、Homebrew と RVM をインストールしようとして行き詰まりました。

ターミナルに入力すると:

 ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

通常のテキスト ブロックを返し、最後に次のように表示されます。

 WARNING: Improper use of the sudo command could lead to data loss
 or the deletion of important system files. Please double-check your
  typing when using sudo. Type "man sudo" for more information.

 To proceed, enter your password, or type Ctrl-C to abort.

Password:

ルート パスワードを入力しようとしても何も起こりません。何かを返す唯一の入力は、'Sorry, try again.' というメッセージとともに返されるエンター キーを押すことです。

RVM のインストールを実行しようとすると、同じことが起こります。

  Searching for binary rubies, this might take some time.
  Found remote file https://rvm.io/binaries/osx/10.9/x86_64/ruby-2.0.0-p247.tar.bz2
  Checking requirements for osx.
  Installing  macports.................................................................................................................
 ..............................................................
     connorashton password required for 'make install': .......

また、何も入力できません。また、テキスト カーソルを表示する代わりに、小さな灰色の四角形が表示されることに注意してください。

どんな助けでも大歓迎です!

<------- 編集 ------->

コメントありがとうございます。ようやく動きがあり、パスワードのプロンプトを通過しました。ただし、RVM は別のエラーで戻ってくるようになりました。

  Downloaded archive checksum did not match, archive was removed!
  If you wish to continue with not matching download add '--verify-downloads 2' after 
   the          command.

  Downloading https://rvm.io/binaries/osx/10.9/x86_64/ruby-2.0.0-p247.tar.bz2 failed.
   Mounting remote ruby failed, trying to compile.
    connorashton password required for 'softwareupdate -l': 

そのため、パスワードを再入力すると、再び実行が開始されましたが、次のように戻ってきました。

   Retrieving rubygems-2.1.11
   There is no checksum for 'http://production.cf.rubygems.org/rubygems/rubygems-     
     2.1.11.tgz' 
     or 'rubygems-2.1.11.tgz', it's not possible to validate it.
    This could be because your RVM install's list of versions is out of date. 
      You may want    to
     update your list of rubies by running 'rvm get stable' and try again.
    If that does not resolve the issue and you wish to continue with unverified download
     add '--verify-downloads 1' after the command.

     There has been an error while trying to fetch rubygems. 
      Halting the installation.

質問して申し訳ありませんが、これを起動して実行したいだけです!

4

4 に答える 4

51

stdin にリダイレクト/dev/nullするEOFと、そのプロセスからの読み取り呼び出しが即座に行われます。これは通常、プロセスを tty から切り離すのに役立ちます (このようなプロセスはデーモンと呼ばれます)。たとえば、バックグラウンド プロセスを ssh 経由でリモートで開始する場合、stdinをリダイレクトして、プロセスがローカル入力を待機しないようにする必要があります。

/dev/null にリダイレクトするもう 1 つの理由は、未使用のファイル記述子が stdin 用に作成されるのを防ぐためです。これにより、実行時間の長いプロセスが多数ある場合に、開いているファイル ハンドルの合計を最小限に抑えることができます。

于 2013-11-13T13:47:33.637 に答える
49

</dev/nullスクリプトが入力を待たないようにするために使用されます。

コマンドラインでの < /dev/null & の使用法からの引用:

< /dev/nullは EOF をプログラムに即座に送信するために使用されるため、入力を待たずに ( /dev/nullnull デバイスである は、書き込まれたすべてのデータを破棄する特殊なファイルですが、書き込み操作が成功したことを報告し、データを何も提供しません。そこから読み取り、EOF をすぐに生成するプロセス)。&前のプロセスをバックグラウンドで実行するために使用される特殊なタイプのコマンド区切り記号です。

したがって、コマンドは次のとおりです。

nohup myscript.sh >myscript.log 2>&1 </dev/null &
# |               ^^^^^^^^^^^^^ ^^^^ ^^^^^^^^^^ ^
# |                    |           |      |     run in background
# |                    |           |      |     
# |                    |           |   don't expect input
# |                    |           |   
# |                    |           redirect stderr to stdout
# |                    |           
# |                    redirect stdout to myscript.log
# |
# keep running the command no matter whether the connection is lost or you logout

myscript.logコマンドをバックグラウンドに移動し、入力を待たずに stdout と stderr の両方を出力します。

于 2013-11-13T14:26:41.557 に答える
4

</dev/nullスクリプトに空の入力を提供します...

于 2013-11-13T13:47:56.603 に答える
3

stdinあたかもEOF( ^D) が送信されたかのように、を閉じる方法です。この例のようにコマンドで使用して、mailコマンドが からの入力を期待しないことを示すことができますstdin

また、プロセスをデーモン化するためにもよく使用されます (行儀の良いデーモンを作成するための推奨されるアプローチのストップ 6 ) 。

于 2013-11-13T13:48:22.167 に答える