bash で & の後の ; が予期しないトークン エラーを返すのはなぜですか?

bash で & の後の ; が予期しないトークン エラーを返すのはなぜですか?

次のエラーが発生しました:

bash: 予期しないトークン `;' の近くに構文エラーがあります

次のコマンドにより:

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

;ジョブをバックグラウンドで実行するときに、コマンドを区切るのは違法ですか&? それとも、これが機能しない別の理由があるのでしょうか?

ありがとう。

答え1

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

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

答え2

ちなみに、根本的な問題は、(Bourne 由来の)シェルが空のコマンドを許可しないことです。

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

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

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

C 派生言語では空の文が許可されます。

Pascal と PERL には、ターミネータではなくセパレータがあります。

答え3

いいえ、ただ混乱していて、何を意味しているのかよく分からないだけです。

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

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

それはうまくいきます。さらに明確に言えば、次のようになります。

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

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

関連情報