linux - 可以安全地假设 sh 已安装吗?

标签 linux bash unix command-line scripting

我正在使用一系列命令行来在 Linux 系统上创建文件、设置变量等。 我无法判断执行期间实际使用哪个 shell,但我知道它将是 csh、tcsh、sh、ksh 或 bash 之一。

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

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

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

最佳答案

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

command -v sh

所以你可以这样做:

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

但是有一个问题:csh 不支持引用此处的文档,这将使编写脚本的过程变得非常痛苦。

由于您的目标是 Linux,因此您可以直接编写 sh 脚本并使用 shebang #!/bin/sh#!/usr/bin/env sh.

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

关于linux - 可以安全地假设 sh 已安装吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70591439/

相关文章:

php - Cron 作业在早上 5 点到晚上 10 点之间每 90 秒运行一次 PHP 脚本?

bash - 如何减去 2 个不同文件中的 2 个数字?

linux - 删除文件中模式之间所有出现的某些字符

使用线程计算两个数字的总和

linux - 什么 Linux 驱动子系统/API 用于简单的屏幕/监视器设备?

linux - 在模式之后添加字符串不起作用

linux - 什么是 unix/linux 内部机制?

linux - 在 Unix 中比较两个大文件

python - 如何在Python 3中使用轮询

linux - 在隔离的unix环境中执行终端命令