`sh` 命令的目的是什么?

H2O*_*aCl 11 bash

sh命令在交互使用和在 bash 脚本内部使用时的目的是什么?

除了 hash bang 行(第一行)之外,应该在 bash 系统上sh替换为bash

例子:

#!/bin/bash
sh -c "command"
Run Code Online (Sandbox Code Playgroud)

pot*_*sdl 13

这么多问题......我会一次回答一个。

1) 交互式使用 sh 命令的目的是什么?提供一个新的环境上下文,所以如果你想尝试一些环境变量设置,你可以。当你完成后,exit出去并没有造成任何伤害。

此外,如果您在不同的 shell 中,例如 zsh 或 csh,并且想在shshell 中执行,这会切换您。

2) 当在上面的 bash 脚本中使用时,它会再次为“命令”运行提供一个包含的环境上下文。您也可以将它与

#!/bin/bash
sh -c "command" &
Run Code Online (Sandbox Code Playgroud) 并分叉“命令”以与脚本的其余部分并行运行。

3)我想说,如果它是特别需要的东西bash,那么明确地把它放在你的散列行中。但由于在大多数后来的 *nix 系统sh上等效于bash,因此可能没有必要。

  • “最近”不包括 Debian 及其衍生产品,因为它们将 Dash 用作`/bin/sh`,因此相当大比例的系统并非如此。 (2认同)

Der*_*ler 7

当我执行时会发生什么sh

如果您只是从shshell开始,您将在当前 shell 中启动另一个 shell

当我sh在脚本中使用时会发生什么?

同样的事情,您在正在处理脚本的 shell 中启动另一个 shell。

我应该简单地使用/bin/bashif 那是什么/bin/sh点吗?

没有。如果脚本被设计为与任何shell一起工作,那么它被设计为针对所有 shell 之间的最小公分母工作(据我所知,这是POSIX 标准的一部分)。
更改为特定的解释器不应该是有害的(因为它们都符合相同的标准),但它会降低兼容​​性,同时根本没有任何好处。

那么,我应该一直使用/bin/sh吗?

作为口译员

不可以。如果您自己编写脚本,那么您还可以使用更具体的解释器(如 bash),前提是该解释器提供了您想要使用的附加功能。但请记住,使用您的脚本的每个人都需要拥有您选择的解释器。

启动另一个进程

如果您只是想在自己的上下文中启动一个新进程,那么无论如何,请使用/bin/sh.

那么这一切有什么意义呢?

如果你想在它自己的上下文中执行某些东西,你应该在一个新的 shell 中执行它。
实现这一点的最简单方法是启动一个新的 shell(使用sh)并将命令传递给它。

只要您的东西不是专门为特定 shell 制作的脚本,就没有理由调用特定的 shell。只需调用任何外壳,通过使用sh

如果您有一个使用仅在 中可用的特殊语法的脚本,bash那么您应该相应地设置shebang

  • 即使 `bash` 和 `sh` 是同一个程序并且在你的系统上是相同的,如果用那个名字调用,`bash` 应该更像 `sh` 而不是 `bash`。使用 `sh` 语义的脚本比使用 `bash` 扩展的脚本更具可移植性。 (2认同)