【问题标题】:Safe to assume sh being installed?可以安全地假设 sh 已安装?
【发布时间】:2022-01-05 10:35:50
【问题描述】:

我正在开发一系列命令行来在 Linux 系统上创建文件、设置变量等。 我不知道在执行过程中实际会使用哪个 shell,但我知道它将是 csh、tcsh、sh、ksh 或 bash 之一。

csh 和 tcsh 不兼容 bourne 是我目前的主要问题,因为它们使用不同的命令/语法来设置变量和条件表达式。

如果可以安全地假设它存在,我可以简单地创建一个带有 shebang 的 shell 脚本来切换到 /bin/sh。

因此我想知道:假设 sh 已安装且可用是否安全,或者是否有另一种更优雅的方式来处理不同的 shell 样式而无需创建单独的脚本?

【问题讨论】:

标签: linux bash unix command-line scripting


【解决方案1】:

可以安全地假设在 POSIX 兼容系统中存在 sh,但它的路径可能会有所不同。 Open Group 规范说要确定标准 sh 实用程序的位置:

command -v sh

所以你可以这样做:

"`command -v sh`" <<EOS
echo my super sh script
EOS

但是有一个问题:csh 不支持 quoted heredocs,这会让编写脚本的过程非常痛苦。

当您以 Linux 为目标时,您可以直接编写 sh 脚本并使用 shebang #!/bin/sh#!/usr/bin/env sh

请注意,脚本中设置的变量对父 shell 不可用。为此,您需要 source 脚​​本,在这种情况下,语法很重要,您必须至少编写 shcsh 版本。

【讨论】:

  • 使用 #!/usr/bin/env sh
猜你喜欢
  • 2011-09-20
  • 2011-06-16
  • 2012-12-01
  • 2021-09-09
  • 2015-03-15
  • 2018-11-03
  • 2020-11-14
  • 2016-12-13
  • 2013-10-28
相关资源
最近更新 更多