Использовать статус выхода. Из справочной страницы nginx:
Exit status is 0 on success, or 1 if the command fails.
и изhttp://www.tldp.org/LDP/abs/html/exit-status.html:
$? reads the exit status of the last command executed.
Пример:
[root@d ~]# /usr/local/nginx/sbin/nginx -t;echo $?
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
0
[root@d ~]# echo whatever > /usr/local/nginx/nonsense.conf
[root@d ~]# /usr/local/nginx/sbin/nginx -t -c nonsense.conf;echo $?
nginx: [emerg] unexpected end of file, expecting ";" or "}" in /usr/local/nginx/nonsense.conf:2
nginx: configuration file /usr/local/nginx/nonsense.conf test failed
1
Пример сценария:
#!/bin/bash
/usr/local/nginx/sbin/nginx -t 2>/dev/null > /dev/null
if [[ $? == 0 ]]; then
echo "success"
# do things on success
else
echo "fail"
# do whatever on fail
fi
В bash
вы можете приблизиться к этому, предоставив пользовательскую $PROMPT_COMMAND
настройку переменных для -вылета из текущего списка заданий.
Доказательство -концепции -:
$ PROMPT_COMMAND='unset ${!j*}; eval "$(jobs -l | awk '\''{gsub("[^[:digit:] ]", ""); printf "j%d=%d\n", $1, $2}'\'')"'
Затем вы должны сделать pidtree $j2
вместо pidtree %2
, предполагая, что в $IFS
нет чисел, иначе вам придется заключить $j2
в кавычки, что потребует еще двух нажатий клавиш.
Не проще ли просто запомнить PID при создании фоновых заданий?
bash
:
declare -a bgjobpids
[...]
do_some_thing &
pid=$!
index=${#bgjobpids[@]}
bgjobpids[index]=$pid
[...]
do_some_thing_else &
pid=$!
index=${#bgjobpids[@]}
bgjobpids[index]=$pid
Если вы хотите, чтобы это было только для нескольких команд, то можно использовать программируемое завершение. Скорее всего, это не POSIX, но, по крайней мере, он доступен в нескольких оболочках (, и базовый механизм даже не обязательно должен быть одним и тем же ).
Таким образом, вы должны ввестиpidtree %2
Tab , и оболочка преобразует это в
pidtree 31736
Я бы счел это элегантным и удобным.
Недостаток :Сохранение существующих конфигураций завершения для этих команд требует ручного вмешательства (например, :сначала запустите вашу функцию; если он не совпадает, заставьте его вызывать исходный ).
_pidtree () {
local job pid
if [[ ${COMP_WORDS[COMP_CWORD]} =~ ^%[1-9][0-9]* ]]; then
job="${COMP_WORDS[COMP_CWORD]:1}"
pid="$(jobs -l | awk -v job="$job" '$1 ~ "^\\[" job "\\]" { print $2; }')"
COMPREPLY=("$pid")
fi
}
complete -F _pidtree pidtree
Это работает в bash
. Это можно было бы сделать без awk
, и это, безусловно, можно сделать более совместимым способом.
Задания, содержащие символы новой строки, могут быть проблемой, но, поскольку это ваша интерактивная оболочка, похоже, нет риска, что это может быть использовано.