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


12

私はUbuntuに尋ねて、以下を提案していた答えを編集しました

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):失敗しますが、ウィンドウは表示され1223ませんが、プロセスは明らかに開始されます()gedit

    $ 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いますが、なぜこれらのシェルでスペースがエラーを引き起こしていないのですか?


私のマシンであるUbuntu 12.04では、このコマンドはに対して正常に実行されdashます。
cuonglm 14年

nohup command、私の記憶に実行する独立したttyあなたapplication.According dashの延長ashDebian ashashによって開発されOpenBSD、それは限られたシェル、でもMaemoのOSダッシュを使用しています(N900モバイルは上のDebianベース)ですが、ash家族のシェルは、限られた使用がbashやtcshのを期待しています。
ペルシャ湾14年

@Gnoucハァッ、おそらく異なるバージョン(私はDebianを使用しています)?dashバージョンを印刷する方法がわかりませんが、パッケージはです0.5.7-3、あなたのものは何ですか?また、実行していることを確認しますdashか?それがUbuntuのデフォルトshですよね?
テルドン

@MohsenPahlevanzadeh私はあなたのポイントが何であるかわかりnohupません、私は何を知っていますか、私の質問は、なぜ>&いくつかのシェルでnohupだけで動作するようです。
テルドン

次のリンクを使用して、シェルの要約を表示できます。unix.stackexchange.com/ questions
45684

回答:


18
nohup gedit &> /dev/null

POSIX構文であり、次と同じです。

nohup gedit &
> /dev/null

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

nohup gedit >& /dev/null

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

zsh(多くの場合)csh構文も提供しますが、Bourneシェルのx>&y fd複製演算子もサポートしているため、競合が発生しています。

ls >&file

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

ls >&2

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

ls >& ./2

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

bash最初は理解していませんでしたが>&、その&>代わりにオペレータを導入し、プロセスでPOSIXコンプライアンスを破りました(ただし、スクリプトでは使用されませんcmd &> xxx)。

ksh2009年にksh93t +でその演算子をコピーし、2008年にR35でmkshをコピーしました(posixモードで無効化)>&

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

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

リダイレクトstdoutとstderrはPOSIX / Bourne >&でもありません&>

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

cmd > file 2>&1

POSIX/Bourne「Bourne」によるBash inを意味しますか?
パンディア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.