web-dev-qa-db-ja.com

一部のシェルで「Nohupコマンド>&/ dev / null」が「機能する」ように見えるのはなぜですか?

以下を示唆しているAsk Ubuntuで answer を編集しました

Nohup gedit >& /dev/null & 

彼らが実際に意味したとき

Nohup gedit &> /dev/null & 

後者は、stderrとstdoutの両方を/dev/nullに正しくリダイレ​​クトします。前者は&と呼ばれるファイルを作成するか、他の場合と同様にエラーが発生する可能性が高いと予想していました。

$ echo "foo" >& 
bash: syntax error near unexpected token `newline'

代わりに、前者とまったく同じように機能するようで、geditウィンドウが表示され、エラーメッセージは出力されません。

これはシェル固有であることにも注意する必要があります。

  • bash(4.2.45(1)-release)、zsh(5.0.2)、csh(deb package version:20110502-2)およびtcsh(6.18.01):上記のように機能し、エラーメッセージは表示されず、ファイルは作成されません。

  • dash(0.5.7-3):

    $ Nohup gedit >& /dev/null & 
    $ dash: 2: Syntax error: Bad fd number
    
  • ksh(93u + 2012-08-01):失敗しましたが、geditウィンドウは表示されませんが、プロセスは明らかに開始されています(1223):

    $ Nohup gedit >& /dev/null & 
    [1] 1223
    $ ksh: /dev/null: bad file unit number
    
  • fish(2.0.0):

    > Nohup gedit >& /dev/null & 
    fish: Requested redirection to something that is not a file descriptor /dev/null
    Nohup gedit >& /dev/null & 
                   ^
    

それで、なぜこのコマンドはいくつかのシェルでエラーなしで(そして作成された出力ファイルなしで)単に実行され、他のシェルでは失敗するのですか? Nohupの明らかに特殊なケースで>&は何をしていますか? >& /dev/null>&/dev/nullとして解釈されていると思いますが、なぜこれらのシェルでスペースがエラーを引き起こしていないのですか?

12
terdon
Nohup gedit &> /dev/null

pOSIX構文であり、以下と同じです。

Nohup gedit &
> /dev/null

これは、バックグラウンドでNohup geditを実行してから、コマンドを実行せずに> /dev/nullリダイレクトを実行します。

Nohup gedit >& /dev/null

はPOSIX構文ではなく、stdoutとstderrの両方を/ dev/nullにリダイレクトするcsh方法です。 cshには、Bourneにあるような2>&1演算子がないため、cshがstderrをリダイレクトする唯一の方法です。

zsh(頻繁に)はcsh構文も提供しますが、Bourne Shellのx>&yfd duplication演算子もサポートします。つまり、そこに競合があります。

ls >&file

lsのstdoutとstderrをfileにリダイレクトしますが、ファイルが2の場合、次のように問題が発生します

ls >&2

stdoutをfd 2(dup(2, 1))が指すリソースにリダイレクトすることを意味します。だからあなたはそれを書く必要があります:

ls >& ./2

lsのstdoutとstderrの両方を現在のディレクトリの2というファイルにリダイレクトしたい場合。または、標準の構文を使用します。

bashは当初>&を理解していませんでしたが、代わりに&>演算子を導入し、プロセスでPOSIX準拠を破っています(ただし、スクリプトがcmd &> xxxを使用することはほとんどありません)。

kshはその演算子を2009年にksh93t +にコピーし、mkshをR35に2008年にコピーしました(posixモードでは無効)。ただし、>&はコピーしませんでした。

bashは、2.05で>&のサポートを追加しました。

busybox shは1.13(2008)で&>>&の両方のサポートを追加しました。

リダイレクトstdoutおよびstderrを意味する>&&>もPOSIX/Bourneではありません。

Stdoutとstderrの両方を移植可能にリダイレクトする場合、構文は次のとおりです。

cmd > file 2>&1
18