&&
大多数 shell 提供类似和的函数,;
以某种方式链接命令的执行。但是,如果命令已经在运行,我仍然可以根据第一个命令的结果添加另一个要执行的命令吗?
说我跑了
$ /bin/myprog
some output...
但我真的很想要/bin/myprog && /usr/bin/mycleanup
。我不能杀死myprog
并重新启动一切,因为会浪费太多时间。如果有必要,我可以Ctrl+Z它和fg
/ 。bg
这是否允许我链接另一个命令?
我最感兴趣的是 bash,但欢迎所有常见 shell 的答案!
答案1
您应该能够在您所在的同一个 shell 中使用以下命令执行此操作wait
:
$ 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.
答案2
fg
返回并返回其恢复的程序的退出代码。因此,您可以使用 暂停程序^Z,然后使用fg && ...
恢复它。
$ /bin/myprog
some output...
^Z
[1]+ Stopped /bin/myprog
$ fg && /usr/bin/mycleanup
答案3
不确定您所要求的是否可行,但如果您仍然拥有启动程序的外壳,您可以随时检查$?
最后一个进程的退出状态:
$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi
答案4
如果作业位于前台,则这些命令中的任何一个都将具有与您期望的相同的行为。
[ $? -eq 0 ] && prog2
(( $? )) || prog2
注意:$?将包含正在运行的程序退出时的返回状态。
这明确说明了如果您最初输入该命令,shell 将执行的操作。
prog1 && prog2
如果第一个命令没有读取stdin
并且在前台运行,则可以在第一个命令运行时输入新命令。当第一个命令执行时,shell 将读取并执行它。如果该命令将在后台运行,则它不太可能读取stdin
.
编辑:也可以将作业放在后台并使用命令WAIT
。如果其他作业也在后台运行,则必须小心谨慎。需要作业规范才能让命令WAIT
返回等待的作业的状态。