Jak i dlaczego „exec false” zamyka terminal?

8

Wiem, że jest to prawdopodobnie dość bezcelowe pytanie, ale jestem ciekawy, dlaczego exec falsezamyka terminal tak jak exitrobi.

Chciałbym również wiedzieć, czy jest to dopuszczalny sposób zamknięcia terminalu, czy nie.

władca smoków
źródło
Również odpowiednia lektura: Jaka jest różnica między eval a exec?
Sergiy Kolodyazhnyy

Odpowiedzi:

10

exec falsezastępuje bieżącą powłokę przez wykonanie polecenia false(tutaj nie jest to wbudowana powłoka, ale /bin/falselub jakikolwiek falseplik wykonywalny, który pojawi się jako pierwszy w PATH), który szybko kończy działanie. Jeśli powłoka była najwyższym procesem uruchomionym w emulatorze terminali, nie ma w niej żadnych procesów, więc emulator terminala jest zamknięty.

Jest to dopuszczalny alternatywny sposób zamknięcia terminala, podobnie jak wiele podobnych poleceń:

exec true
exec sleep 0
exec echo
...

Zobacz także: what-does-an-exec-command-do

jlliagre
źródło
Na marginesie, bashwykona pewne czyszczenie przed wywołaniem, w exectym zapisaniem poleceń do .bash_history. Jeśli więc po prostu chcesz zapisać .bash_historyi uruchomić nową powłokę w tym samym oknie terminala, możesz to zrobić, pisząc exec bash.
kasperd
Ok dziękuję, że doskonale odpowiedziałeś na moje pytanie :)
władca smoków
I dobre pytanie! dlatego poparłem oba! ;)
Fabby
@jiliagre execwywołuje polecenia znalezione w PATH, a nie wbudowane. Na przykład exec [[ $USER = root ]]zwróci bash: exec: [[: not foundbłąd. W przypadku OP falsetak się nazywa /bin/false, a nie wbudowana powłoka. W przeciwnym razie dobra odpowiedź, stąd +1. Na marginesie, execmoże być rodzajem polecenia odcinającego, tzn. Gdyby te trzy polecenia w twoim przykładzie zostały przekształcone w skrypt, nic poza pierwszym execnie byłoby osiągnięte, ponieważ execzastąpiłoby powłokę wywoływaną przez skrypt dowolnym poleceniem po prawej stronie z exec.
Sergiy Kolodyazhnyy