なぜ ; bashで予期しないトークンエラーを返しますか?


21

エラーを受け取りました:

bash:予期しないトークン `; 'の近くの構文エラー

次のコマンドが原因です。

evince foo.pdf bar.pdf &; emacs foo.tex &

ジョブをバックグラウンドで;使用&するときにコマンドを分離することは違法ですか?または、これが機能しなかった別の理由がありますか?

ありがとうございました。

回答:


40

セミコロンは必要ありません。バックグラウンドに送信された後、別のコマンドを自由に取得できます。

evince foo.pdf bar.pdf & emacs foo.tex &

2
これは、2時間の宣誓後のifステートメントの助けになりました。誰かがこれを必要とする場合:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Oktav

13

ところで、核となる問題は、(ボーン由来の)シェルが空のコマンドを許可しないことです。

「;」「&」はコマンド終了記号で、それぞれfgとbgを意味します。そう "; ;" (または行の先頭の「;」)も無効です。

(「\」を使用して行を継続しない限り、まだ終了していないコマンドがある場合、改行は「;」を意味します。)

言語はこれらのポリシーによって大きく異なります。

C派生言語では、空のステートメントを使用できます。

PascalとPERLには区切り記号があり、終端記号はありません。


-3

いいえ、混乱しているだけで、あなたが言っていることはまったく解決できません。

バックグラウンドに配置するコマンドで&をグループ化する必要があります。

$ (evince foo.pdf bar.pdf &); emacs foo.tex &

それはうまくいきます。さらに明確になります:

$ (evince foo.pdf bar.pdf &); (emacs foo.tex &)

特に、終了後にさらにコマンドを連鎖させたい場合。


1
不要なセミコロンの使用を正当化するためだけにサブシェルを作成する必要はありません。括弧は単なる構文ではありません。追加の作業が行われます。
-chepner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.