Сценарий оболочки: выполнение команды после выполнения команды "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() и будет удален из стека.

Другие вопросы по тегам