Czy usunięcie skryptu z tego skryptu jest bezpieczne?

9

Wyobraź sobie, że mam skrypt foo. Powinien zostać uruchomiony raz, gdy użytkownik się zaloguje, i nie jest potrzebny po pomyślnym uruchomieniu.

Moje pytanie: czy bezpiecznie jest usunąć plik skryptu z poziomu skryptu?

Na przykład:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0
htorque
źródło
2
Nie do końca niezwiązane, możesz użyć, #!/bin/bash -eaby upewnić się, że plik skryptu zostanie usunięty tylko wtedy, gdy nic nie pójdzie źle.
sr_
3
Tak, jest bezpieczny. Jeśli chcesz wiedzieć, dlaczego, przeczytaj stackoverflow.com/questions/2028874/...
jofel
2
@ jofel Brzmi dobrze, sugeruję, abyś udzielił odpowiedzi. :-)
htorque
W razie wątpliwości możesz zamienić dwie ostatnie linie na exec rm /path/to/foo.
kasperd

Odpowiedzi:

5

Bezpiecznie jest usunąć plik powłoki podczas jego uruchamiania, ponieważ programy obsługi plików nie mają wpływu (ponownego) przeniesienia odpowiedniego pliku.

Aby uzyskać więcej informacji, zobacz tutaj .

Jofel
źródło
2
Pamiętaj tylko, że może nie działać, w zależności od systemu (tzn. rm <it-self>Nie powiedzie się na HP-Ux.
Ouki,
1
@Ouki, dlaczego? Czy nie naruszyłoby to POSIX?
maxschlepzig
3
@maxschlepzig POSIX pozwala na usunięcie ostatniego linku do pliku wykonywalnego, który jest obecnie wykonywany, aby zakończyć się niepowodzeniem: unlinkmoże się nie powieść ETXTBUSY. (Co dziwne, „czysta procedura” i „wspólny tekst” nie są zdefiniowane w specyfikacji; AFAIK oznaczają składnik programu wykonywalnego: sam plik wykonywalny lub używaną przez niego bibliotekę). Wszystkie główne unikaty inne niż HP-UX pozwalają na zmianę nazw plików wykonywalnych i odłączanie ich.
Gilles 'SO - przestań być zły'
2
@Ouki To powinno być łatwe do obejścia, po prostu kończąc skrypt exec rm /path/to/foo.
kasperd
0

Zawsze się tym denerwowałem, więc:

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

Alternatywnie możesz utworzyć łańcuch do tymczasowego skryptu:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme
Michael Dillon
źródło
1
W obu sugerowanych podejściach nadal będzie istniał proces powłoki, który nie zakończył wykonywania skryptu do czasu jego usunięcia.
kasperd
To, co chcesz zrobić, toexec rm /path/to/shell/script
osvein