bash 中的“bash”命令是什么?

Zoz*_*zez 9 command-line bash

我刚刚bash在 Ubuntu 的终端中输入,这很正常。但在那之后,我不得不两次输入 exit 。什么是bash在bash命令?

sud*_*dus 36

bash 是一个命令解释器,一个shell,一个带有解释你输入的命令的接口的程序。

当您调用bashfrom 时bash,您只需在原始外壳的“内部”启动一个新外壳。当您退出第二个 shell 时,您将返回到原始 shell。您可以使用该exit命令退出每个 shell 。

  • 如果你有许多 sudo 命令要运行,你可以用 `sudo bash` 来启动一个 root bash,然后退出它回到你的用户级 bash。这将保存多个密码条目,并更改提示以提醒您在 root 时不要做任何坏事。 (3认同)
  • 我在客户站点安装了 RHEL,他们的 sudoers 策略设置为 5 分钟。不幸的是,我的思考时间是 6 分钟。我目前用于输入“bash”的目的是,当我向论坛发布命令时,我可以将 PS1 设置为没有我的详细信息,然后轻松恢复正常。 (2认同)
  • @Paul_Pedant 你是对的,但更合适的方法是`sudo -s`(shell)或`sudo -i`(登录shell)。 (2认同)

小智 19

外壳和终端模拟器之间存在差异。

Shell 是一种将您的命令传递给内核并执行的东西。终端模拟器程序允许您与 shell 进行交互。终端emualtors的例子是gnome-terminalkonsole和壳bashzshsh等终端模拟器被简单地命名为终端在大多数桌面环境。

当您打开终端时,它默认使用 shell。对于大多数终端,它是bash. 您可以更改默认外壳。首先运行whoami以获取您的用户名。然后运行您的用户名cat /etc/passwd | grep user_name在哪里user_name。最后一个词是您的默认 shell。现在您可以使用sudo usermod --shell /bin/shell_name user_name.

此外,当您键入bash它时,它只会打开另一个外壳。您可以通过运行简单地退出另一个 shell exit。例如执行zshsh将带您到其他shell。您可以阅读 shell 的手册页man shell_name以了解shell之间的差异。然而,手册页非常大而且阅读起来很复杂,它会让你头晕目眩。执行 aman shell_name | wc -l会给你行数。

希望有帮助

  • `猫xxx | grep yyy` 是`cat` 的无用用法:`grep` 可以自己读取文件:`grep user_name /etc/passwd`。 (22认同)
  • 为什么 usermod 超过 chsh? (10认同)
  • “外壳是一种将您的命令传递给内核的东西”..误导性的废话。这和内核有什么关系?shell 允许您在路径中执行命令,为 OS API 提供一些工具(如列出目录等),有时还提供一种用于自动化任务的简单语言。 (9认同)
  • @SeñorCMasMas,shell 与内核的关系是 shell 解析命令行并进行系统调用,要求内核启动一个进程。shell 并不完全处理启动进程本身的任何低级内容。 (3认同)
  • @ilkkachu,“内核”这个词只是分散了对 OP 问题答案的注意力。`/bin/bash` 是一个 _program_,其目的是通过运行其他程序来解释您键入的命令。是的,在它如何工作的细节中有“内核”和“系统调用”。但 OP 的问题不在于它是如何工作的。问题是关于它的作用。 (3认同)

小智 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。(...但不要搞砸登录,否则它会在它通常返回到您的外壳时关闭您的会话)