Сценарий оболочки: выполнение команды после выполнения команды "exit" в сценарии оболочки
У меня есть ситуация, когда у меня есть команда в моем сценарии оболочки, которая должна быть выполнена после того, как команда выхода выполнена в том же самом сценарии (я знаю!! Это звучит безумно!!)
Я хочу найти решение для чего-то вроде
#!/bin/sh
ls -l ~/.
exit $?
touch ~/abc.txt
Здесь я хочу команду touch ~/abc.txt
выполнить после exit $?
побежал и команда touch ~/abc.txt
может быть любая команда.
Ограничения: 1) Я не могу изменить exit $?
часть приведенного выше сценария. 2) Команда должна быть выполнена только после exit $?
команда.
Я не уверен, есть ли решение для этого, но любая помощь приветствуется.
4 ответа
Типичный подход - установить ловушку:
trap 'touch ~/abc.txt' 0
Это вызовет сенсорную команду при выходе из оболочки. В некоторых снарядах (например, bash
), ловушка также будет выполнена, если сценарий завершится в результате сигнала, но в других (например, dash
) Я не буду. Нет переносимого способа вызова команды, только если последняя команда была exit
,
Я не знаю, почему вы хотите сделать что-то подобное, но, возможно, попробуйте что-то вроде этого: оберните ваш сценарий в другой. В вашем родительском скрипте оцените ваш дочерний скрипт с помощью команды, такой как eval или source, затем извлеките из вашего дочернего скрипта последнюю команду и выполните ее отдельно таким же образом.
Это должно сработать, даже если ОП не хочет перемещать выход.
#!/bin/sh
ls -l ~/.
RES=$? #save res for later.
touch ~/abc.txt
exit $RES
Я сомневаюсь, что прямой путь возможен любым способом.
Но может быть обходной путь: вы можете обернуть исполняемый скрипт в другой процесс? Затем вы можете вызывать все, что захотите, в сценарии упаковки, как только сценарий упаковки выполнит свою функцию exit() и будет удален из стека.