我正在尝试类似的事情,即想在&
单行/单行中打印出在后台使用 & 号 ( ) 生成的进程的 pid:
$ tail -f /var/log/syslog & ; echo $!
bash: syntax error near unexpected token `;'
...但不断收到可怕的语法错误,这让我来到了这篇文章。
在上面的示例中我没有意识到的是,&
(和号)也是命令分隔符/终止符bash
- 就像;
(分号)一样!笔记:
BashSheet - Greg 的维基百科
- [命令] ; [command] [newline]
分号和换行符将同步命令彼此分开。
- [command] & [command]
单个 & 号终止异步命令。
所以 - 假设&
是 中的命令行终止符bash
,在我上面的示例中,后面跟着一个;
,它也是命令行终止符 -bash
扼流圈。答案是简单地删除分号;
,并且只让 & 号&
作为单行中的命令行分隔符:
$ tail -f /var/log/syslog & echo $!
[1] 15562
15562
$ May 1 05:39:16 mypc avahi-autoipd(eth0)[23315]: Got SIGTERM, quitting.
May 1 06:09:01 mypc CRON[2496]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
May 1 06:17:01 mypc CRON[5077]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
May 1 06:25:01 mypc CRON[7587]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
^C
$ May 1 06:52:01 mypc CRON[15934]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ))
$ ps -p 15562
PID TTY TIME CMD
15562 pts/0 00:00:00 tail
$ kill 15562
$ ps -p 15562
PID TTY TIME CMD
[1]+ Terminated tail -f /var/log/syslog
$ ps -p 15562
PID TTY TIME CMD
$
...但是,在此示例中,您必须手动终止生成的进程。
回到 OP 问题,我可以用这个命令行重建问题:
$ tail -f /var/log/syslog & pid=$! { sleep 2; kill $pid; }
bash: syntax error near unexpected token `}'
考虑到这一点 - bash 将&
其视为分隔符,然后看到“合法”命令pid=$!
,然后 - 与先前的“合法”命令未终止,看到一个花括号{
,这意味着当前 shell 中的新命令组。所以答案只是pid=$!
用分号终止;
,这样新的命令组就可以正常启动:
$ tail -f /var/log/syslog & pid=$! ; { sleep 2; kill $pid; }
[1] 20228
May 1 05:39:16 mypc avahi-autoipd(eth0)[23315]: Got SIGTERM, quitting.
May 1 06:09:01 mypc CRON[2496]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
May 1 06:17:01 mypc CRON[5077]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
May 1 06:25:01 mypc CRON[7587]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ))
May 1 06:52:01 mypc CRON[15934]: (root) CMD (test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ))
$ ps -p 20228
PID TTY TIME CMD
[1]+ Terminated tail -f /var/log/syslog
$
请注意,该tail -f
过程似乎终止了属性,但在我的bash
(版本 4.2.8(1))中,我必须在 shell 中按 Enter,才能看到“ [1]+ Terminated ...
”消息。
希望这会有所帮助,
干杯!