Получение кода завершения последней команды оболочки в другом script
Я пытаюсь усилить уведомление script. Способ, которым работает script, заключается в том, что я помещал его в длинную рабочую команду оболочки, а затем после завершения длинной работы script запускались всевозможные уведомления.
Например:
sleep 100; my_notify
Было бы неплохо получить код выхода длинного script, проблема в том, что вызов my_notify
создает новый процесс, который не имеет доступа к переменной $?
.
Для сравнения:
~ $: ls nonexisting_file; echo "exit code: $?"; echo "PPID: $PPID"
ls: nonexisting_file: No such file or directory
exit code: 1
PPID: 6203
против.
~ $: ls nonexisting_file; my_notify
ls: nonexisting_file: No such file or directory
exit code: 0
PPID: 6205
my_notify
script имеет в нем следующее:
#!/bin/sh
echo "exit code: $?"
echo "PPID: $PPID"
Я ищу способ получить код выхода предыдущей команды, не слишком сильно меняя структуру команды. Я знаю, что, если я изменю его, чтобы больше походить на time
, например. my_notify longrunning_command...
моя проблема будет решена, но мне действительно нравится, что я могу ее подкрепить в конце команды, и я боюсь усложнений этого второго решения.
Можно ли это сделать или это принципиально несовместимо с тем, как работают оболочки?
Моя оболочка zsh
, но мне бы хотелось, чтобы она работала с bash
.
Ответы
Ответ 1
Для этого вам действительно нужно использовать функцию оболочки. Для простого script, как это должно быть довольно легко, чтобы он работал как в zsh, так и в bash. Просто поместите в файл следующее:
my_notify() {
echo "exit code: $?"
echo "PPID: $PPID"
}
Затем отправьте этот файл из файлов запуска оболочки. Хотя, поскольку это будет запущено из вашей интерактивной оболочки, вы можете использовать $$, а не $PPID.
Ответ 2
Это несовместимо. $?
существует только в текущей оболочке; если вы хотите, чтобы он был доступен в подпроцессах, вы должны скопировать его в переменную среды.
Альтернативой является запись функции оболочки, которая каким-то образом использует ее.
Ответ 3
Одним из способов реализации этого может быть использование тега EOF и мастера script, который создаст ваш my_notify script.
#!/bin/bash
if [ -f my_notify ] ; then
rm -rf my_notify
fi
if [ -f my_temp ] ; then
rm -rf my_temp
fi
retval=`ls non_existent_file &> /dev/null ; echo $?`
ppid=$PPID
echo "retval=$retval"
echo "ppid=$ppid"
cat >> my_notify << 'EOF'
#!/bin/bash
echo "exit code: $retval"
echo " PPID =$ppid"
EOF
sh my_notify
Вы можете уточнить этот script для своей цели.