如果我以“/bin/bash”或“/usr/bin/env bash”开始 bash 有什么区别?

Mar*_*tin 33 bash environment-variables

在 shell 脚本中,在 shebang( #!) 行指定语言解释器。据我所知,建议使用,#!/usr/bin/env bash因为env它总是位于/usr/bin目录中,而位置bash可能因系统而异。但是,如果bash直接使用/bin/bash或通过env实用程序启动,是否有任何技术差异?另外,如果我没有为 指定任何变量envbash则在未修改的环境中启动,我是否正确?

Chr*_*her 36

从某种意义上说,使用env可考虑在该路径设置为“便携”bash是(不相关/bin/bash/usr/bin/bash/usr/local/bin/bash~/bin/bash,或者其他路径),因为它在环境中指定。通过这种方式,脚本作者可以使他的脚本更容易在许多不同的系统上运行。

在另一种意义上,使用envto findbash或任何其他 shell 或命令解释器被认为是一种安全风险,因为可能会使用未知的二进制文件(恶意软件)来执行脚本。在这些环境中,有时根据管理策略,路径是用完整路径明确指定的:#!/bin/bash

一般来说,env除非您知道自己是在这些环境中的一种环境中编写,否则请使用这些环境来仔细检查风险的微小细节。

当 Ubuntu 首次开始使用dash2011 年的某个时候,该操作破坏了许多脚本。在 askubuntu.com 上有关于它的讨论。大多数脚本都是编写的#!/bin/sh,它们是指向/bin/bash. 共识是:脚本编写者负责指定解释器。因此,如果您的脚本应始终使用 BASH 调用,请从环境中指定它。这使您不必猜测路径,这在各种 Unix/Linux 系统上是不同的。此外,如果明天/bin/sh成为指向其他 shell 的链接(如/bin/newsh.

另一个区别是该env方法不允许将参数传递给解释器。

  • 是的,但更令人担忧的是,用户的 PATH 可能会将恶意软件放在 PATH 中。并非每个系统都受到如此严格的审查,但是,例如,考虑一个系统,该系统具有在威胁可以从任何地方发起的环境中运行的关键任务服务。在某些环境中,就像国防部下属的任何组织一样,信息保障官可能会在审查正在测试其操作权限的系统时对其进行标记。并非所有漏洞都是已知的,指定完整路径可以缓解 FUD。 (4认同)
  • 将“env”视为查找“bash”的安全风险。你的意思是,如果我使用 `#!/usr/bin/env bash` shebang,那么将从我的 $PATH 中搜索 bash,例如,如果我的 $PATH 是“/usr/local/sbin:/usr/local/bin :/usr/sbin:/usr/bin:/sbin:/bin" 并且我在 `/usr/local/sbin` 目录中有一个名为 `bash` 的恶意软件(改为执行`/usr/local/sbin/bash` `/usr/bin/bash` 因为 $PATH 中 `/usr/local/sbin` 位于 `/usr/bin` 之前),那么这是一个安全风险吗? (2认同)
  • `env -S` 确实将参数传递给解释器。 (2认同)

Ant*_*hon 5

除了使用速度/usr/bin/env稍慢之外,如果您启动一个这样的程序,那么没有什么区别。(除非 /bin/bash不存在但bash位于路径中的某个位置)

env可以修改调用命令的环境,但只能env在从命令行启动时使用,在 shebang 行(取决于操作系统)中无法指定选项。

的源代码env相当小,因此如果您熟悉 C,您可以验证它在做什么。Sinceexecvp用于调用要执行的程序。env如果您检查进程树,甚至不会有父进程。