Есть ли способ в сценарии оболочки, что если [ - PullRequest
0 голосов
/ 22 января 2019

В сценарии оболочки я хочу сделать это, если сценарий оболочки завершился неудачно (выход с ненулевым значением), затем перед выходом из процесса сделайте что-нибудь.

Как мне вставить такой блок оператора ifв моем сценарии оболочки.

Это возможно?

Например,

set -e
echo $password > confidential.txt
rm <file-that-does-not-exist>
rm confidential.txt

Я хочу убедиться, что confidential.txt обязательно будет удален в любом случае

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Используйте trap с псевдосигналом EXIT:

remove_secret () {
    rm -f /path/to/confidential.txt
}
trap remove_secret EXIT

Вы, вероятно, не хотите, чтобы файл оставался, если скрипт завершается с 0, поэтому EXIT происходит независимо от выходаcode.

Обратите внимание, что без set -e, rm для несуществующего файла не останавливает сценарий.

0 голосов
/ 22 января 2019

Если вы работаете в Linux (или другой операционной системе с /proc/*/fd), у вас есть еще лучший вариант: Удалить confidential.txt, прежде чем вводить в него пароль.

Это может выглядеть примерно так:

exec 3<>confidential.txt
rm -f -- confidential.txt
printf '%s\n' "$password" >&3

... а затем прочитать из этого удаленного файла:

cat "/proc/$$/fd/3"  ## where $$ is the PID of the shell that ran the exec command above

Поскольку файл уже удален , он гарантированно будет иметь право на сборку мусора вашей файловой системой в тот момент, когда ваш скрипт (или последняя программа, которая начала наследовать свои файловые дескрипторы) завершается или уничтожается, даже если он убит таким образом, чтобы не допустить возникновения ловушек или обработки сигналов.

0 голосов
/ 22 января 2019

Используйте команду trap:

trap 'if [ $? -ne 0 ]; then echo failed; fi' EXIT

Ловушка EXIT запускается при выходе из сценария, а $? содержит состояние последней команды перед ее завершением.

Обратите внимание, что состояние завершения сценария оболочки - это состояние последней выполненной команды.Таким образом, в вашем скрипте это будет статус

rm confidential.txt

, а не ошибка

rm filethatdoesnotexist

Если вы не используете set -e в скрипте, что заставляет его завершиться, как тольколюбая команда получает ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...