Безопасно ли удалять файл сценария из этого сценария?

9

Представь, у меня есть сценарий foo. Он должен быть запущен один раз, когда пользователь входит в систему, и не требуется после успешного запуска.

Мой вопрос: безопасно ли удалять файл скрипта из скрипта?

Например:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0
htorque
источник
2
Не совсем не связанный, вы можете использовать его, #!/bin/bash -eчтобы гарантировать, что файл сценария будет удален, только если ничего не пошло не так.
sr_
3
Да, это безопасно. Если вы хотите знать, почему, прочитайте stackoverflow.com/questions/2028874/…
jofel
2
@jofel Звучит хорошо, я предлагаю тебе сделать ответ. :-)
htorque
Если вы сомневаетесь, вы можете заменить две последние строки на exec rm /path/to/foo.
Касперд

Ответы:

5

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

Для получения дополнительной информации см. Здесь .

jofel
источник
2
Просто имейте в виду, что это может не сработать, в зависимости от вашей системы (то есть rm <it-self>не удастся на HP-Ux.
Ouki
1
@ Оуки, почему? Разве это не нарушит POSIX?
maxschlepzig
3
@maxschlepzig POSIX позволяет удалить последнюю ссылку на исполняемый файл, который в данный момент выполняется, и потерпеть неудачу: unlinkможет произойти сбой ETXTBUSY. (Как ни странно, «чистая процедура» и «общий текст» не определены в спецификации; AFAIK означают компонент исполняемой программы: сам исполняемый файл или используемую библиотеку). Все основные модули, кроме HP-UX, позволяют переименовывать и удалять исполняемые файлы.
Жиль "ТАК - прекрати быть злым"
2
@ Ouki Это должно быть легко обойти, просто заканчивая скрипт exec rm /path/to/foo.
Касперд
0

Я всегда нервничал по этому поводу, поэтому я сделал:

(sleep 5; rm /path/to/shell/script) &
exit 0

В качестве альтернативы вы можете подключиться к временному сценарию:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme
Майкл Диллон
источник
1
В обоих предложенных вами подходах все равно будет процесс оболочки, который не завершит выполнение сценария к моменту его удаления.
Касперд
То, что вы хотите сделать,exec rm /path/to/shell/script
Osvein