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

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 .


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.