我刚刚bash
在 Ubuntu 的终端中输入了命令,一切正常。但之后,我不得不输入两次 exit。bashbash
中的命令是什么?
答案1
bash
是一个命令解释器、一个 shell、一个带有接口的程序,可以解释您输入的命令。
当您调用bash
from 时bash
,您只需在原始 shell 内部启动一个新 shell。当您退出第二个 shell 时,您将返回到原始 shell。您可以使用该exit
命令退出每个 shell。
答案2
shell 和终端仿真器之间存在差异。
Shell 是将您的命令传递给内核并执行的东西。终端仿真程序让您与 shell 进行交互。终端仿真器的示例有gnome-terminal
,konsole
shell 有bash
、等zsh
。sh
在大多数桌面环境中,终端仿真器简称为 Terminal。
打开终端时,它默认使用一个 shell。对于大多数终端来说,默认 shell 是bash
。您可以更改默认 shell。首先运行whoami
以获取您的用户名。然后运行您的用户名在cat /etc/passwd | grep user_name
哪里user_name
。最后一个字是您的默认 shell。现在您可以使用 更改您的 shell sudo usermod --shell /bin/shell_name user_name
。
此外,当您键入时,bash
它只会打开另一个 shell。您可以通过运行 来简单地退出另一个 shell exit
。例如,执行zsh
或sh
将带您进入另一个 shell。您可以使用 阅读 shell 的手册页以man shell_name
了解 shell 之间的差异。但是手册页非常大且复杂,阅读起来会让您头晕目眩。执行man shell_name | wc -l
将为您提供行数。
希望有帮助
答案3
当您在现有 shell 中运行 bash 时,这将启动一个新的 bash shell 作为您正在使用的 shell 的子进程。
您可以使用 ps 命令在 Linux 环境中看到这一点:
$ ps xjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
20282 20286 20282 20282 ? -1 S 26075 0:00 sshd: john@pts/0
20286 20287 20287 20287 pts/0 32674 Ss 26075 0:00 \_ -bash
20287 32135 32135 20287 pts/0 32674 S 26075 0:00 \_ bash
32135 32674 32674 20287 pts/0 32674 R+ 26075 0:00 \_ ps xjf
必须输入两次 exit 才能退出的原因是,第一次 exit 是退出子 bash(此示例中的进程 ID 32135),第二次 exit 是退出原始 bash(此处的 PID 20287)。
如果由于某种原因您想要启动一个新的 bash(或其他 shell),并且知道您不想将控制权返回给原始(父)bash shell,而是想结束会话,则可以通过 exec 命令启动新的 bash,该命令会用新进程替换当前正在运行的 shell。(它实际上保留相同的进程 ID,即使您通过 exec 命令更改为新的 shell(如 ksh):
$ ps -f
UID PID PPID C STIME TTY TIME CMD
john 3463 20287 0 13:47 pts/0 00:00:00 ps -f
john 20287 20286 0 06:11 pts/0 00:00:00 bash
$ exec ksh
$ ps -f
UID PID PPID C STIME TTY TIME CMD
john 3471 20287 0 13:47 pts/0 00:00:00 ps -f
john 20287 20286 0 06:11 pts/0 00:00:00 ksh
(请注意,原始 bash 和替换它的 ksh 都有 PID 20287)
通过这种方式使用 exec,当您退出子 bash 时,父级已经消失,因此您将结束会话。
旁注:exec bash 的一个好处是可以更快地注销。
exec 还会使用更少的资源,因为原始 shell 已被替换(与通过启动许多 shell 来消耗资源的 bash fork 炸弹相反)
除了启动 shell 之外,exec 还可以让您通过您的登录名授予其他人访问某些内容的权限,并确保他们退出后不会留在您的 shell 中 - 例如,我去同事的办公桌,以我的身份登录并为他们执行 sudo(某个命令)或执行 ssh(其他地方)。一旦他们结束这些操作,它会关闭他们的终端会话,而不是将他们放回我的登录 shell。(...但不要搞砸登录,否则它会在正常返回到您的 shell 时关闭您的会话)
答案4
虽然迟到了,但在我看来,其他答案并没有切中要点。
bash
是程序其目的是通过运行其他程序来解释你的命令。它相当复杂——有很多奇特的方法可以构造命令bash
——但最簡單您可以输入的命令bash
只是其他程序的名称。
如果您foo
在命令提示符下键入,bash
将搜索名为的程序foo
,如果找到,它将运行该程序,等待程序完成,然后打印另一个提示。
那么,猜猜看如果您bash
在命令提示符下键入...会发生什么?