为什么这样; 之后并在bash中返回意外的令牌错误?


21

我收到错误:

bash:意外令牌';'附近的语法错误

由于以下命令:

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

;使用&后台作业时,使用命令分隔命令是否非法?还是还有其他原因无法解决?

谢谢。

Answers:


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

顺便说一句,核心问题是(伯恩派生的)shell不允许空命令。

“;” “&”是命令终止符,分别表示fg和bg。所以“;;” (或行首的“;”)也无效。

(如果存在尚未终止的命令,则换行符表示“;”,除非您使用“ \”继续该行。)

这些政策的语言差异很大:

C派生的语言允许空语句。

Pascal和PERL具有分隔符,而不是终止符。


-3

不,这只是令人困惑,无法完全理解您的意思。

您需要将&与要在后台放入的命令分组:

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

很好 更明确的是:

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

尤其是如果您随后还要在结束后链接更多命令。


1
无需为了证明使用不必要的分号而产生子shell。括号不仅仅是语法。他们导致额外的工作要做。
chepner 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.