exit
, выполняемый удаленной оболочкой, завершит эту оболочку. В случае, когда выполняется true
, удаленная оболочка завершит работу из-за отсутствия дальнейших команд для выполнения, но exit
завершит ее, даже если после нее (будут дополнительные команды, как в любом скрипте ).
В простом случае, когда сеанс SSH предназначен только для выполнения набора команд (, где он не устанавливает туннели или не использует совместное использование соединения ), сеанс завершается, когда удаленный оболочка завершается, независимо от того, как удаленная оболочка завершается (либо по exit
, либо по какой-то ошибке, либо по получении сигнала HUP
, либо просто по достижению конца скрипта ).
Обратите внимание, что в руководстве сказано: «[...] и все соединения X11 и TCP закрыты». Это означает, что соединение может не прерваться только потому, что удаленная оболочка завершила работу. Это будет иметь место, когда вы, например, используете совместное использование соединения с ssh -M
иssh -S
(или настройку ControlMaster
в ~/.ssh/config
; см. man ssh
и man ssh_config
). Я предполагаю, что туннели SSH также будут поддерживать сеанс SSH, пока они не будут явно закрыты.
Чтобы действительно разорвать соединение SSH, вы можете отправить управляющую командуexit
с помощью ssh -O exit user@host
. Это приведет к завершению всех общих сеансов SSH на user@host
.
Здесь необходимо рассмотреть два аспекта:
echo
и pwd
действительно не могут отображаться как независимые процессы, потому что они являются встроенными командами оболочки bash
(см. вывод type echo
, например. -но обратите внимание, что они вполне могут быть реализованы как внешние исполняемые файлы, а то, что реализовано или не реализовано как встроенная или внешняя программа, варьируется от оболочки к оболочке ). df
)с другой стороны являются независимыми процессами, но они часто завершаются так быстро, что вам будет трудно "поймать" их с помощью ps
, (, т.е. они уже завершены, когда ps
запускается и по этой причине не отображается в выводе ). Короткий ответ :, потому что так устроена система. Люди, разрабатывавшие Unix, давно должны были принять решение, какие команды будут внутренними (, распознаваемыми и выполняемыми самой оболочкой ), а какие внешними (выполняются через отдельные двоичные файлы/процессы. ).
Некоторые команды, такие как cd
, pwd
или set
, очевидно, должны быть внутренними, поскольку они относятся к внутреннему состоянию оболочки, поэтому они не могут выполняться внешними процессами. Что касается большинства других команд, у разработчиков был выбор, должна ли команда быть внутренней или внешней -, и на самом деле между различными оболочками существуют различия в этом отношении.
Например, были некоторые старые системы/оболочки, где echo
была внешней командой. В настоящее время echo
является внутренней командой почти во всех оболочках, однако устаревшая внешняя команда /bin/echo
все еще существует (, по крайней мере, в Linux ), вероятно, из соображений совместимости.
Как сказано в другом ответе, используя команду type
(, которая, очевидно, должна быть внутренней командой, такой как cd
), вы можете проверить, какие команды являются внутренними, а какие внешними:
raj@rafa:~$ type echo
echo is a shell builtin
raj@rafa:~$ type df
df is hashed (/bin/df)
raj@rafa:~$ type ps
ps is /bin/ps
raj@rafa:~$
Обратите внимание на сообщение «df is hashed» -это означает, что команда df
уже использовалась в этом сеансе оболочки, поэтому оболочка запомнила свое местоположение и не должна снова искать ее на диске, когда я хотите запустить его. С другой стороны, ps
еще не использовался в этом сеансе, поэтому команда просто показывает путь к нему.
sleep
является внешним процессом, потому что Bash по умолчанию не предоставляет его встроенную версию. Это было бы нетрудно сделать, так как программа в значительной степени выполняет только один системный вызов, но между реализациями есть различия, некоторые не ограничены целочисленными значениями, некоторые принимают спецификаторы, такие как m
для минут и т. д.
df
и ps
также обычно являются внешними процессами. df
возможно, работает слишком быстро, чтобы вы могли его поймать (в моей системе, time df
показывает, что для его запуска требуется 0,003 с ), но вывод ps
по необходимости также содержит ps
сам процесс, который вы можете увидеть, например, ps -ef |grep ps
.
С другой стороны, echo
и pwd
встроены в Bash, что вы можете узнать, запустив, например,. type echo
. Должно быть написано echo is a shell builtin
. Ни то, ни другое не должно быть, и они обычно доступны как /bin/echo
и /bin/pwd
, а также (или, возможно, /usr/bin/
, если в вашей системе есть отдельные /bin
и/usr/bin
). pwd
может быть внешним, поскольку текущий рабочий каталог наследуется дочерними процессами. С другой стороны,cd
не может , потому что изменения в рабочем каталоге не влияют на родительский процесс.
Вы также можете иметь оболочку, которая реализует sleep
, df
, ps
, cp
и тому подобное внутри. Например, Busybox содержит реализации всех из них. Тем не менее, тот, что в моей системе, по-прежнему разветвляет другой процесс для запуска sleep
(, но, похоже, не делает этого дляdf
).