【问题标题】:Why can a script with a "#!/bin/sh" shebang use bash-only features?为什么带有“#!/bin/sh”shebang 的脚本可以使用 bash-only 功能?
【发布时间】:2018-12-05 17:43:46
【问题描述】:

当我运行以下脚本时:

#!/bin/sh

declare path="my.path"

if [[ "$path" =~ \. ]] ; then
    echo "yes"
else
    echo "no"
fi

我打印了yes

但如果我没记错的话,declare[[ ]] 在 POSIX shell 中不可用;那么这个脚本怎么没有抛出任何错误呢?

我在 git for Windows 上运行脚本,它可以解释这种奇怪的行为吗?

【问题讨论】:

  • sh 可以是任何 POSIX 兼容的 shell。该脚本可能适用于 GitBash/WSL/macOS/OpenBSD(因为 sh 由 bash 或 ksh 提供)但不适用于 Debian/Ubuntu/Android/FreeBSD。如果您坚持使用 POSIX 功能,它将适用于每个系统。如果您指定bash,它将适用于每个安装了 bash 的系统。

标签: bash shell posix git-bash


【解决方案1】:

/bin/sh 是指向您的实际 shell 的链接。这并不意味着您正在运行纯 POSIX。 Git for windows homepage 非常清楚地表明您正在运行 bash,您的 git-bash 标记也是如此。

即使在 Linux 上,/bin/sh 仍然可以是 bash:

ls -la /bin/sh
lrwxrwxrwx. 1 root root 4 Mar 27 09:33 /bin/sh -> bash

【讨论】:

  • 只是一个额外的问题,如果 git 在 bash 环境中运行我的脚本,不管 shebang,为什么带有 shebang #!/bin/bash 的脚本允许像 lib::func() 这样的函数名称,但是一个带有shebang #!/bin/sh 抛出以下错误:lib::func : not a valid identifier ?
  • @JordanRepovy 这是因为 Bash 有一个 POSIX 兼容模式,当它被调用为 shbash --posixPOSIXLY_CORRECT=1 bash 时会启用该模式。在这种模式下,某些功能被禁用或修改。在man bash 中搜索posix mode 以了解受影响的功能的长列表
  • @thatotherguy 哦,是的,我忘了!谢谢你的解释:)
  • 要注意的关键是 POSIX 承认 [[ 是一个保留字,而 要求 它没有任何特殊含义。这意味着/bin/sh 可以选择性地支持它(bash 甚至在以sh 调用时也会支持)。
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 2014-09-29
  • 1970-01-01
  • 2019-02-01
  • 2023-03-27
  • 2013-07-01
  • 2012-02-05
相关资源
最近更新 更多