Wiem, że jest to prawdopodobnie dość bezcelowe pytanie, ale jestem ciekawy, dlaczego exec false
zamyka terminal tak jak exit
robi.
Chciałbym również wiedzieć, czy jest to dopuszczalny sposób zamknięcia terminalu, czy nie.
Wiem, że jest to prawdopodobnie dość bezcelowe pytanie, ale jestem ciekawy, dlaczego exec false
zamyka terminal tak jak exit
robi.
Chciałbym również wiedzieć, czy jest to dopuszczalny sposób zamknięcia terminalu, czy nie.
Odpowiedzi:
exec false
zastępuje bieżącą powłokę przez wykonanie polecenia false
(tutaj nie jest to wbudowana powłoka, ale /bin/false
lub jakikolwiek false
plik 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
bash
wykona pewne czyszczenie przed wywołaniem, w exec
tym zapisaniem poleceń do .bash_history
. Jeśli więc po prostu chcesz zapisać .bash_history
i uruchomić nową powłokę w tym samym oknie terminala, możesz to zrobić, pisząc exec bash
.
exec
wywołuje polecenia znalezione w PATH
, a nie wbudowane. Na przykład exec [[ $USER = root ]]
zwróci bash: exec: [[: not found
błąd. W przypadku OP false
tak się nazywa /bin/false
, a nie wbudowana powłoka. W przeciwnym razie dobra odpowiedź, stąd +1. Na marginesie, exec
może być rodzajem polecenia odcinającego, tzn. Gdyby te trzy polecenia w twoim przykładzie zostały przekształcone w skrypt, nic poza pierwszym exec
nie byłoby osiągnięte, ponieważ exec
zastąpiłoby powłokę wywoływaną przez skrypt dowolnym poleceniem po prawej stronie z exec
.