不行,csh 中内置的wait 命令只能等待所有作业完成。您引用的文档中的命令是一个单独的可执行文件,可能位于 /usr/bin/wait 或类似位置。此可执行文件不能用于您想要的用途。
我建议使用bash 及其更强大的wait 内置函数,它允许您等待特定的作业或进程ID。
在tcsh 手册页中,wait 等待所有后台作业。 tcsh 与 csh 兼容,这是您链接的大学文档所指的内容。
wait shell 等待所有后台作业。如果 shell 是交互式的,中断会打断等待并导致 shell
打印所有未完成作业的名称和作业编号。
您可以在csh documentation here 上找到这个确切的文字。
文档中描述的wait 可执行文件实际上是一个单独的命令,它等待进程ID 列表。
但是,wait 可执行文件实际上并不能等待正在运行的 shell 脚本的子进程,并且没有机会在 shell 脚本中做正确的事情。
例如,在 OS X 上,/usr/bin/wait 就是这个 shell 脚本。
#!/bin/sh
# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperciva Exp $
# This file is in the public domain.
builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"$@"}
无论如何,我无法让 /usr/bin/wait 可执行文件在 Csh 脚本中可靠地工作......因为后台作业不是 /usr/bin/wait 进程本身的子进程。
#!/bin/csh -f
setenv PIDDIR "`mktemp -d`"
sleep 4 &
ps ax | grep 'slee[p]' | awk '{ print $1 }' > $PIDDIR/job
/usr/bin/wait `cat $PIDDIR/job`
我强烈建议用 bash 或类似的方式编写此脚本,其中内置的 wait 确实允许您等待 pid 并且从后台作业中捕获 pid 更容易。
#!/bin/bash
sleep 4 &
pid_sleep_4="$!"
sleep 7 &
pid_sleep_7="$!"
wait "$pid_sleep_4"
echo "waited for sleep 4"
wait "$pid_sleep_7"
echo "waited for sleep 7"
如果您不想重写您正在处理的整个 csh 脚本,您可以像这样从 csh 脚本中调用 bash。
#!/bin/csh -f
bash <<'EOF'
sleep 4 &
pid_sleep_4="$!"
sleep 7 &
pid_sleep_7="$!"
wait "$pid_sleep_4"
echo "waited for sleep 4"
wait "$pid_sleep_7"
echo "waited for sleep 7"
'EOF'
请注意,您必须以 'EOF' 结束该heredoc,包括单引号。