Zozzizzez Asked: 2020-08-02 01:30:41 +0800 CST2020-08-02 01:30:41 +0800 CST 2020-08-02 01:30:41 +0800 CST 什么是 bash 中的“bash”命令? 772 我刚刚bash在 Ubuntu 的终端中输入,一切正常。但在那之后,我不得不输入 exit 两次。bashbash中的命令是什么? command-line bash 5 个回答 Voted sudodus 2020-08-02T01:39:15+08:002020-08-02T01:39:15+08:00 bash是一个命令解释器,一个外壳程序,一个带有解释你输入的命令的接口的程序。 当您从 调用bash时bash,您只需在原始外壳“内部”启动一个新外壳。当您从第二个 shell 退出时,您将返回到原来的 shell。exit您可以使用该命令从每个 shell 退出。 Best Answer Wasif 2020-08-02T02:22:17+08:002020-08-02T02:22:17+08:00 shell 和终端仿真器之间是有区别的。 Shell 是将您的命令传递给内核并被执行的东西。终端仿真器程序让您可以与 shell 交互。终端仿真器的示例是gnome-terminal,konsole和 shell 是bash,zsh等等sh。终端仿真器在大多数桌面环境中被简单地命名为终端。 当您打开终端时,它默认使用 shell。对于大多数终端来说,它是bash. 您可以更改默认外壳。首先运行whoami以获取您的用户名。然后运行cat /etc/passwd | grep user_namewhere user_nameis your user name。最后一个词是您的默认外壳。现在您可以使用sudo usermod --shell /bin/shell_name user_name. 此外,当您键入它时,bash它只会打开另一个外壳。您可以通过运行简单地退出另一个 shell exit。比如执行zsh或者sh会带你到其他shell。您可以阅读 shell 的手册页man shell_name以了解 shell 之间的区别。然而,手册页非常大而且阅读起来很复杂,它会让你头晕目眩。执行 aman shell_name | wc -l会给你行数。 希望有帮助 JohnGH 2020-08-04T05:07:04+08:002020-08-04T05:07:04+08:00 当您在现有 shell 中运行 bash 时,这会启动一个新的 bash shell 作为您正在使用的 shell 的子进程。 您可以在 Linux 环境中使用 ps 命令看到这一点: $ 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 两次才能退出的原因是第一个退出正在退出子 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 (注意原来的 bash 和替换它的 ksh 都有 PID 20287) 通过以这种方式使用 exec,当您退出子 bash 时,父级已经消失,因此您将结束会话。 旁注: exec bash 的一个好处是可以更快地注销。 exec 还使用更少的资源,因为原始 shell 已被替换(与 bash fork 炸弹相反,它通过启动许多 shell 来消耗资源) 除了启动 shell 之外,exec 还可以让您通过登录名让其他人访问某些内容,并确保他们退出后不会留在您的 shell 中 - 例如,我去同事的办公桌,以我的身份登录并 exec sudo(有些命令)或 exec ssh(其他地方)为他们。一旦他们结束了,它就会关闭他们的终端会话,而不是将它们放回我的登录 shell。(......但不要搞砸登录,否则它会在正常返回到您的 shell 时关闭您的会话) gboffi 2020-08-02T11:56:03+08:002020-08-02T11:56:03+08:00 例如,当您在终端中键入时,zsh ret您输入 Zshell 并使用该 shell 的语法和内置函数进行操作,直到您键入exit ret. 如果您的默认shell 是 Bash,您可能会注意到不同之处! 现在,当您从默认 shell(即 Bash)的命令提示符键入 时会发生什么bash ret?与 Zshell 之前发生的情况完全相同,只是很难分辨出什么不同,因为您将使用与以前相同的语法、相同的内置函数和相同的别名/shell 函数! 但是有许多不同之处,最明显的可能是SHLVBash 每次启动时递增的环境变量。 Solomon Slow 2020-08-04T06:14:41+08:002020-08-04T06:14:41+08:00 派对迟到了,但 IMO,其他答案并没有直截了当。 bash是一个程序,其目的是通过运行其他程序来解释您的命令。它非常复杂——有很多奇特的方式可以构建bash命令——但是你可以输入的最简单bash的命令只是其他程序的名称。 如果您foo在命令提示符下键入,bash将搜索名为 的程序foo,如果找到,则运行该程序,等待程序完成,然后打印另一个提示。 所以,猜猜如果你bash在命令提示符下键入会发生什么......
bash
是一个命令解释器,一个外壳程序,一个带有解释你输入的命令的接口的程序。当您从 调用
bash
时bash
,您只需在原始外壳“内部”启动一个新外壳。当您从第二个 shell 退出时,您将返回到原来的 shell。exit
您可以使用该命令从每个 shell 退出。shell 和终端仿真器之间是有区别的。
Shell 是将您的命令传递给内核并被执行的东西。终端仿真器程序让您可以与 shell 交互。终端仿真器的示例是
gnome-terminal
,konsole
和 shell 是bash
,zsh
等等sh
。终端仿真器在大多数桌面环境中被简单地命名为终端。当您打开终端时,它默认使用 shell。对于大多数终端来说,它是
bash
. 您可以更改默认外壳。首先运行whoami
以获取您的用户名。然后运行cat /etc/passwd | grep user_name
whereuser_name
is your user name。最后一个词是您的默认外壳。现在您可以使用sudo usermod --shell /bin/shell_name user_name
.此外,当您键入它时,
bash
它只会打开另一个外壳。您可以通过运行简单地退出另一个 shellexit
。比如执行zsh
或者sh
会带你到其他shell。您可以阅读 shell 的手册页man shell_name
以了解 shell 之间的区别。然而,手册页非常大而且阅读起来很复杂,它会让你头晕目眩。执行 aman shell_name | wc -l
会给你行数。希望有帮助
当您在现有 shell 中运行 bash 时,这会启动一个新的 bash shell 作为您正在使用的 shell 的子进程。
您可以在 Linux 环境中使用 ps 命令看到这一点:
您必须键入 exit 两次才能退出的原因是第一个退出正在退出子 bash(本例中的进程 ID 32135),然后第二个退出原始 bash(此处为 PID 20287)。
如果出于某种原因您想启动一个新的 bash(或其他 shell)并且知道您不想将控制权返回给原始(父)bash shell,而是要结束您的会话,您可以通过以下方式启动新的 bash exec 命令,它用新进程替换当前正在运行的 shell。(它实际上保持相同的进程 ID,即使您通过 exec 命令更改为 ksh 之类的新 shell):
(注意原来的 bash 和替换它的 ksh 都有 PID 20287)
通过以这种方式使用 exec,当您退出子 bash 时,父级已经消失,因此您将结束会话。
旁注: exec bash 的一个好处是可以更快地注销。
exec 还使用更少的资源,因为原始 shell 已被替换(与 bash fork 炸弹相反,它通过启动许多 shell 来消耗资源)
除了启动 shell 之外,exec 还可以让您通过登录名让其他人访问某些内容,并确保他们退出后不会留在您的 shell 中 - 例如,我去同事的办公桌,以我的身份登录并 exec sudo(有些命令)或 exec ssh(其他地方)为他们。一旦他们结束了,它就会关闭他们的终端会话,而不是将它们放回我的登录 shell。(......但不要搞砸登录,否则它会在正常返回到您的 shell 时关闭您的会话)
例如,当您在终端中键入时,
zsh
ret您输入 Zshell 并使用该 shell 的语法和内置函数进行操作,直到您键入exit
ret.如果您的默认shell 是 Bash,您可能会注意到不同之处!
现在,当您从默认 shell(即 Bash)的命令提示符键入 时会发生什么
bash
ret?与 Zshell 之前发生的情况完全相同,只是很难分辨出什么不同,因为您将使用与以前相同的语法、相同的内置函数和相同的别名/shell 函数!但是有许多不同之处,最明显的可能是
SHLV
Bash 每次启动时递增的环境变量。派对迟到了,但 IMO,其他答案并没有直截了当。
bash
是一个程序,其目的是通过运行其他程序来解释您的命令。它非常复杂——有很多奇特的方式可以构建bash
命令——但是你可以输入的最简单bash
的命令只是其他程序的名称。如果您
foo
在命令提示符下键入,bash
将搜索名为 的程序foo
,如果找到,则运行该程序,等待程序完成,然后打印另一个提示。所以,猜猜如果你
bash
在命令提示符下键入会发生什么......