如何在posix环境中运行bash shell脚本?

3

我试图在ESXi shell中运行一个bash shell脚本。

认为ESXi是posix兼容的,但posix编译器抛出了很多语法错误。

如果有人知道答案,请告诉我。


在 POSIX 环境中运行脚本之前,请先测试它。您可以通过输入 bash --posix scriptname 来模拟其行为。 - devnull
http://mywiki.wooledge.org/Bashism - Grzegorz Żur
在ESXi中,它的bash不同。它是busybox的bash shell。 - anishsane
1个回答

1

手册列出了在POSIX模式下运行时的变化行为。您应相应地调整您的脚本。


以下是在POSIX模式下发生变化的列表:
  1. 当哈希表中的命令不存在时,Bash将重新搜索$PATH以找到新位置。这也可以使用“shopt -s checkhash”实现。
  2. 当作业以非零状态退出时,作业控制代码和内置命令打印的消息为“Done(status)”。
  3. 当作业停止时,作业控制代码和内置命令打印的消息为“Stopped(signame)”,其中signame是例如SIGTSTP
  4. bg内置使用所需格式描述放置在后台的每个作业,其中不包括该作业是否为当前或先前作业的指示。
  5. 出现在保留字上下文中的保留字不会进行别名扩展。
  6. POSIX PS1PS2‘!’扩展为历史记录编号,对‘!!’扩展为‘!’,并且对PS1PS2的值执行参数扩展,无论promptvars选项的设置如何。
  7. 执行POSIX启动文件($ENV),而不是正常的Bash文件。
  8. 只有在命令名称之前的赋值中才会执行波浪线扩展,而不是在行中的所有赋值语句上执行。
  9. 默认的历史记录文件是~/.sh_history(这是$HISTFILE的默认值)。
  10. kill -l’的输出将所有信号名称打印在单行上,用空格分隔,而不带‘SIG’前缀。
  11. kill内置不接受带有‘SIG’前缀的信号名称。
  12. 非交互式shell如果在.文件名中找不到文件名,则退出。
  13. 非交互式shell如果算术扩展中的语法错误导致表达式无效,则退出。
  14. 非交互式shell如果使用.source内置读取的脚本中存在语法错误,或者在eval内置处理的字符串中存在语法错误,则退出。
  15. 除非shell是交互式的,否则重定向运算符不会对重定向中的单词进行文件名扩展。
  16. 重定向运算符不会对重定向中的单词进行单词拆分。
  17. 函数名称必须是有效的shell名称。也就是说,它们不能包含除字母、数字和下划线以外的字符,并且不能以数字开头。在非交互式shell中声明具有无效名称的函数会导致致命的语法错误。
  18. 在命令查找期间,在shell函数之前找到POSIX特殊内置。
  19. 时间保留字可以单独用作命令。使用此方式时,它会显示shell及其已完成的子级的定时统计信息。TIMEFORMAT变量控制定时信息的格式。
  20. 在双引号中出现的${...}扩展的解析和扩展不再将单引号视为特殊字符,并且除了定义为执行模式删除的操作符之一外,不能用于引用闭合大括号或其他特殊字符。在这种情况下,它们不必出现为

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接