以下を示唆している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
として解釈されていると思いますが、なぜこれらのシェルでスペースがエラーを引き起こしていないのですか?
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>&y
fd 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