Чи безпечно видалити файл сценарію з цього сценарію?


9

Уявіть, у мене є сценарій foo. Його слід запустити один раз, коли користувач увійде в систему і не буде потрібен після успішного запуску.

Моє запитання: Чи безпечно видаляти файл сценарію з сценарію?

Наприклад:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0

2
Не зовсім пов'язані між собою, ви можете використовувати #!/bin/bash -eдля того, щоб видалити файл сценарію, лише якщо нічого не піде не так.
sr_

3
Так, це безпечно. Якщо ви хочете знати, чому, читайте stackoverflow.com/questions/2028874 / ...
jofel

2
@jofel Звучить добре, пропоную вам відповісти на це. :-)
htorque

Якщо ви сумніваєтесь, ви можете замінити останні два рядки на exec rm /path/to/foo.
kasperd

Відповіді:


5

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

Більше інформації дивіться тут .


2
Просто майте на увазі, що це може не працювати, залежно від вашої системи (тобто rm <it-self>не вдасться досягти успіху на HP-Ux.
Ouki,

1
@Ouki, чому? Хіба це не порушило POSIX?
maxschlepzig

3
@maxschlepzig POSIX дозволяє видалити останнє посилання до виконуваного файлу, який наразі виконується для відмови: unlinkможе вийти з ладу ETXTBUSY. (Як не дивно, "чиста процедура" і "спільний текст" не визначені в специфікації; AFAIK вони означають компонент виконуваної програми: сам виконуваний файл або бібліотека, яку він використовує). Усі основні об'єднання, окрім HP-UX, дозволяють перейменовувати та від’єднувати виконувані файли.
Жил "ТАК - перестань бути злим"

2
@Ouki Це може бути легко обійти, просто закінчивши сценарій exec rm /path/to/foo.
kasperd

0

Я завжди нервував це, тому зробив:

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

Ви також можете скористатися тимчасовим сценарієм:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme

1
В обох запропонованих підходах все ще буде процес оболонки, який не закінчив виконання сценарію до моменту його видалення.
kasperd

Що ти хочеш зробитиexec rm /path/to/shell/script
osvein
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.