如何在Bash循环中进行后台任务

5
给定以下Bash循环:
for ((x=1; x<=$y; x++)); do echo $x; done
1
2
3
4

如何将各个任务“后台化”?
09:25:58/~ $for ((x=1; x<=$y; x++)); do echo $xi &; done
-sh: syntax error near unexpected token `;'

我尝试使用“bash”来执行echo命令,但也没有成功:

09:26:37/~ $for ((x=1; x<=$y; x++)); do bash -c "echo $x" &; done
-sh: syntax error near unexpected token `;'

&; 都是命令终止符号。每个命令只需要一个即可。 - undefined
@Etan Reisner,你的评论是最有用的。请将其转化为答案。 - undefined
3个回答

12

&; 都是 shell 中的命令终止符。

每个命令只需要终止一次。所以不要同时使用它们:

for ((x=1; x<=$y; x++)); do echo $x & done

您如果使用两个分号,也会得到相同的错误提示:

;

$ for ((x=1; x<=$y; x++)); do echo $x ; ; done
-bash: syntax error near unexpected token `;'

请注意尝试使用;;会出现不同的错误,因为;;是shell中的特殊令牌(在case语句中使用)。
-bash: syntax error near unexpected token `;;'

Shell语法:

%start  complete_command
%%
complete_command : list separator
                 | list
                 ;
list             : list separator_op and_or
                 |                   and_or
                 ;
....
separator_op     : '&'
                 | ';'
                 ;
separator        : separator_op linebreak
                 | newline_list
                 ;

2

This will work:

for ((x=1; x<=y; x++)); do echo $x & done

注意,在 & 后面不需要加上 ;。但是使用换行符会使它更易读:
for ((x=1; x<=y; x++)); do
  echo $x &
done

1
for ((x=1; x<=$y; x++)); do { echo $x & } ; done

花括号不是必需的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接