Нет, встроенная команда wait
в csh
может только ждать завершения всех заданий. Команда в документации, на которую вы ссылаетесь, является отдельным исполняемым файлом, который, вероятно, расположен по адресу /usr/bin/wait
или аналогичным. Этот исполняемый файл нельзя использовать для того, для чего вы хотите его использовать.
Я рекомендую использовать bash
и его более мощную встроенную wait
, которая позволяет вам ждать определенных заданий или идентификаторов процессов.
На справочной странице tcsh
wait
ожидает всех фоновых заданий. tcsh
совместим с csh
, на что ссылается документация университета, на которую вы ссылаетесь.
wait Оболочка ожидает всех фоновых заданий. Если оболочка является интерактивной, прерывание прервет ожидание и вызовет оболочку
распечатывать имена и номера всех оставшихся работ.
Точный текст вы можете найти в документации csh здесь .
Исполняемый файл wait
, описанный в документации, на самом деле является отдельной командой, которая ожидает список идентификаторов процессов.
Однако исполняемый файл wait
на самом деле не способен ожидать дочерние процессы запущенного сценария оболочки и не имеет шансов сделать правильное действие в сценарии оболочки.
Например, в OS X /usr/bin/wait
- это сценарий оболочки.
#!/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 или аналогичном, где встроенное ожидание действительно позволяет вам ждать пиды, и захват пидов из фоновых заданий проще.
#!/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
, над которым работаете, вы можете вызвать bash изнутри csh
сценария, например, так.
#!/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'
Обратите внимание, что вы должны завершить этот heredoc с помощью 'EOF'
, включая одинарные кавычки.