如果我有一个文件
cmd1
cmd2
cmd3
我想彼此独立地运行它们,并且无论它是否输出退出状态都独立(这意味着不要期望结束,只是继续启动进程,这可能会失败或不会。我知道这;
将运行下一个命令,但事实并非如此,因为它会等到上一个命令失败或成功为止。
它就像类似的东西sleep 60m
;然后播放音乐,响铃,运行浏览器,但显然,没有办法等到音乐播放响铃,然后再运行浏览器。它必须立即发生。
添加:例如,如何
从文件中读取行,为每行打开一个终端并运行它?
答案1
只需在每行末尾添加一个 & 符号即可将所有命令分叉到后台。
cmd1 &
cmd2 &
cmd3 &
例子
$ more at_once.bash
#!/bin/bash
echo "1" && sleep 10 &
echo "2" && sleep 10 &
echo "3" && sleep 10 &
pgrep -a sleep
现在当我们运行这个脚本时:
$ ./at_once.bash
1
3
2
7533 sleep 10
7535 sleep 10
7536 sleep 10
您甚至可以看到任务由于其后台性质而无序运行,第三个命令在第二个命令之前被回显。显示pgrep sleep
所有 3 个后台命令同时运行。
笔记:我使用该符号echo "X" && sleep 10
只是为了表明命令正在后台运行。此表示法与后台本身无关,尾随&
是将命令“放入”sleep 10
后台的内容。
&
如果您想在单个命令行中执行此操作,也可以用作分隔符:
$ sleep 10 & sleep 10 & sleep 10 &
[1] 7731
[2] 7732
[3] 7733
检查这一班轮:
$ pgrep -a sleep
7731 sleep 10
7732 sleep 10
7733 sleep 10
我们再次看到它们全部同时运行。如果您要使用分号:
$ sleep 10 ; sleep 10 ; sleep 10
这些sleep 10
命令串行运行需要 30 秒才能完成,而并行运行则只需 10 秒。