我刚刚bash在 Ubuntu 的终端中输入,这很正常。但在那之后,我不得不两次输入 exit 。什么是bash在bash命令?
sud*_*dus 36
bash 是一个命令解释器,一个shell,一个带有解释你输入的命令的接口的程序。
当您调用bashfrom 时bash,您只需在原始外壳的“内部”启动一个新外壳。当您退出第二个 shell 时,您将返回到原始 shell。您可以使用该exit命令退出每个 shell 。
小智 19
外壳和终端模拟器之间存在差异。
Shell 是一种将您的命令传递给内核并执行的东西。终端模拟器程序允许您与 shell 进行交互。终端emualtors的例子是gnome-terminal,konsole和壳bash,zsh,sh等终端模拟器被简单地命名为终端在大多数桌面环境。
当您打开终端时,它默认使用 shell。对于大多数终端,它是bash. 您可以更改默认外壳。首先运行whoami以获取您的用户名。然后运行您的用户名cat /etc/passwd | grep user_name在哪里user_name。最后一个词是您的默认 shell。现在您可以使用sudo usermod --shell /bin/shell_name user_name.
此外,当您键入bash它时,它只会打开另一个外壳。您可以通过运行简单地退出另一个 shell exit。例如执行zsh或sh将带您到其他shell。您可以阅读 shell 的手册页man shell_name以了解shell之间的差异。然而,手册页非常大而且阅读起来很复杂,它会让你头晕目眩。执行 aman shell_name | wc -l会给你行数。
希望有帮助
小智 5
当您在现有 shell 中运行 bash 时,这会启动一个新的 bash 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
Run Code Online (Sandbox Code Playgroud)
您必须键入 exit 两次才能退出的原因是第一个退出是退出子 bash(在此示例中为进程 ID 32135),然后第二个退出原始 bash(此处为 PID 20287)。
如果出于某种原因您想启动一个新的 bash(或其他 shell)并且知道您不想将控制权返回给原始(父)bash shell,而是要结束您的会话,您可以通过以下方式启动新的 bash exec 命令,它用新进程替换当前正在运行的 shell。(它实际上保持相同的进程 ID,即使您通过 exec 命令更改为像 ksh 这样的新 shell):
$ 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
Run Code Online (Sandbox Code Playgroud)
(注意原始 bash 和替换它的 ksh 的 PID 都是 20287)
通过以这种方式使用 exec,当您退出子 bash 时,父 bash 已经离开,因此您将结束会话。
旁注:exec bash 的一个好处是可以更快地注销。
exec 也使用较少的资源,因为原来的 shell 已被替换(与 bash fork 炸弹相反,它通过启动许多 shell 来消耗资源)
除了启动 shell 之外,exec 还可以让您通过您的登录名让其他人访问某些内容,并确保他们在退出后不会留在您的 shell 中 - 例如,我去同事的办公桌,以我的身份登录并 exec sudo(有些命令)或 exec ssh(其他地方)为他们。一旦他们结束,它就会关闭他们的终端会话,而不是将它们放回我的登录 shell。(...但不要搞砸登录,否则它会在它通常返回到您的外壳时关闭您的会话)