Answers:
您应该可以在与wait
命令相同的shell中执行此操作:
$ sleep 30 &
[1] 17440
$ wait 17440 && echo hi
...30 seconds later...
[1]+ Done sleep 30
hi
Bash手册页摘录
wait [n ...]
Wait for each specified process and return its termination status. Each n
may be a process ID or a job specification; if a job spec is given, all
processes in that job's pipeline are waited for. If n is not given, all
currently active child processes are waited for, and the return status is
zero. If n specifies a non-existent process or job, the return status is
127. Otherwise, the return status is the exit status of the last process
or job waited for.
%
,%1
和$!
。提供PID或第二条命令将始终运行很重要。
wait
将无法提供所需的结果。通常使用简短形式,因为它们不容易出现错别字。
fg
从其恢复的程序中返回退出代码。因此,您可以使用暂停您的程序,^Z然后使用fg && ...
来恢复它。
$ /bin/myprog
some output...
^Z
[1]+ Stopped /bin/myprog
$ fg && /usr/bin/mycleanup
myprog
第二次暂停将导致fg
退出代码20终止-非零,因此mycleanup
不会执行链接的命令。
如果作业在前台,则这些命令中的任何一个都将具有您期望的行为。
[ $? -eq 0 ] && prog2
(( $? )) || prog2
注意:$?退出时将包含正在运行的程序的返回状态。
这明确说明了如果您最初输入命令,shell将执行的操作。
prog1 && prog2
如果第一个命令未stdin
在前台读取且正在运行,则可以在第一个命令运行时输入新命令。当第一个命令执行时,shell将读取并执行它。如果该命令将在后台运行,则不太可能正在读取stdin
。
编辑:将作业放在后台并使用WAIT
命令也可以使用。如果其他作业也已在后台运行,则必须谨慎进行。需要作业规范以使WAIT
命令返回等待的作业状态。
wait
也不理想。IMO的优势在于,它为我们提供了更清晰的API。在某些程序运行后,在命令行上键入更多命令对我来说似乎有点不客气。wait
仍然无法获得直接链接到正在运行的PID,并且返回状态。虽然Bash如何实现事情,但这似乎是一个更大的问题:stackoverflow.com/questions/356100/…。因此,这可能是最好的。