Как и почему «exec false» закрывает терминал?

8

Я знаю, что это, вероятно, относительно бессмысленный вопрос, но мне любопытно, почему exec falseзакрывает терминал так же, как это exitделает.

Я также хотел бы знать, является ли это приемлемым способом закрыть терминал или нет.

dragonloverlord
источник
Также актуально чтение: в чем разница между eval и exec?
Сергей Колодяжный,

Ответы:

10

exec falseзаменяет текущую оболочку выполнением команды false(здесь не встроенная оболочка, а /bin/falseкакой-либо falseисполняемый файл, который находится первым в PATH), который быстро завершается. Если оболочка была самым верхним процессом, запущенным в вашем эмуляторе терминала, то внутри него больше не было запущенных процессов, поэтому эмулятор терминала закрыт.

Это приемлемый альтернативный способ закрыть терминал, как и многие другие похожие команды:

exec true
exec sleep 0
exec echo
...

Смотрите также: что делает анекекд

jlliagre
источник
Как примечание стороны, bashперед выполнением вызова выполню определенную очистку, execвключая запись команд в .bash_history. Поэтому, если кто-то просто хочет сохранить .bash_historyи запустить новую оболочку в том же окне терминала, можно сделать это, набрав exec bash.
Касперд
Хорошо, спасибо, что вы отлично ответили на мой вопрос :)
dragonloverlord
И хороший вопрос! поэтому проголосовали оба! ;)
Fabby
@jiliagre execвызывает команды PATH, а не встроенные. Например, exec [[ $USER = root ]]вернет bash: exec: [[: not foundошибку. В случае OP falseэто называется is /bin/false, а не встроенная оболочка. В противном случае хороший ответ, следовательно +1. В качестве примечания, execможет быть своего рода командой обрезания, т. Е. Если бы эти три команды в вашем примере были превращены в сценарий, ничего кроме первого не execбыло бы достигнуто, потому execчто заменила бы оболочка, вызываемая сценарием, любой командой справа из exec.
Сергей Колодяжный,