Подтвердить что ты не робот

Получение кода завершения последней команды оболочки в другом 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.

4b9b3361

Ответ 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 для своей цели.