При обновлении .bashrc в bash или подобном (.bash_profile, .bash_aliases и т.д.) на вашей рабочей станции или сервере Linux последнее, что вы хотите сделать, это выйти из своего терминала и снова войти в систему, чтобы увидеть эти изменения в действии. Спецификация POSIX определяет exec встроенную команду оболочки, которая поможет справиться с таким сценарием и перезагрузить или перезапустить вашу текущую оболочку.
Короче говоря, exec используется для выполнения команды, которая заменит текущий образ процесса новым образом процесса. Это означает, что новый PID не создается и все ресурсы, используемые предыдущим процессом, будут освобождены.
Если exec указано с помощью command, оно должно заменить оболочку на command без создания нового процесса. Если указаны аргументы, они должны быть аргументами для command. Перенаправление влияет на текущую среду выполнения оболочки.
[andreyex@host ~]$ help exec exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...] Replace the shell with the given command. Execute COMMAND, replacing this shell with the specified program. ARGUMENTS become the arguments to COMMAND. If COMMAND is not specified, any redirections take effect in the current shell. Options: -a name pass NAME as the zeroth argument to COMMAND -c execute COMMAND with an empty environment -l place a dash in the zeroth argument to COMMAND If the command cannot be executed, a non-interactive shell exits, unless the shell option `execfail' is set. Exit Status: Returns success unless COMMAND is not found or a redirection error occurs.
Если вы добавите или измените псевдоним bash в вашем файле ~/.bash_aliases, вы можете просто использоватьexec bash, который заменит ваш текущий образ оболочки на новый, загрузив ваш файл конфигурации и позволив вам использовать ваши обновленные псевдонимы в вашем текущем терминале.
[andreyex@linux ~]$ exec bash
📎 Вы также можете использовать переменную окружения $SHELL с помощью команды exec $SHELL, которая была бы совместима со всеми вашими оболочками, хотя имейте в виду, что ваша активная оболочка может отличаться.
Этот способ также полезен, если вы хотите изменить свою текущую оболочку без запуска другого процесса, например, вы входите в систему на удаленном сервере, в итоге получаете старомодную оболочку bourne sh, которую вы можете просто запустить exec bash, чтобы переключиться на свежую среду bash.
На рабочем столе Linux у вас также есть графическая оболочка, которая отличается от оболочки терминала командной строки. Если вы используете дистрибутив Linux с GNOME, например, последнюю версию Ubuntu 20.04 LTS, у вас может быть два разных способа перезагрузки вашей графической оболочки в зависимости от того, какую версию вы используете.
Начиная с версии 3.30.1 оболочки GNOME, использование инструмента командной строки gnome-shell приведет к выходу из системы и возврату к экрану входа в систему. Вместо этого отдайте предпочтение приведенному ниже варианту, который идентичен.
[andreyex@linux ~]$ killall -3 gnome-shell
или
[andreyex@linux ~]$ killall -SIGQUIT gnome-shell
Чтобы перезагрузить вашу графическую оболочку в GNOME до версии 3.30.1, необходимо использовать командную строку gnome-shell. Вы можете использовать Alt+f2 для вызова командной строки или запустить команду из запущенного терминала командной строки.
[andreyex@linux ~]$ gnome-shell --replace &
⚠️ Как упоминалось в help exec, если вы планируете использовать exec с неинтерактивной оболочкой, вы можете захотеть проверить опцию execfail. Если execfail установлено значение, неинтерактивная оболочка не завершится в случае сбоя команды. Интерактивная оболочка не завершится в случае exec сбоя.
exec может использоваться для перенаправления всех выходных данных в файл при запуске без какой-либо команды, например, run exec > output.log, тогда при выполнении любой новой команды ее выходные данные будут перенаправлены в файл журнала, это будет включать все stdin и stderr. Это может быть удобно в cronjob или различных скриптах для ведения журнала.