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

时间:2013-10-10 08:17:03

标签: bash shell

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

认为ESXi与posix兼容,posix编译器引发了很多语法错误。

如果有人有答案,请告诉我

1 个答案:

答案 0 :(得分:1)

manual列出了在POSIX模式下运行时更改的行为。您应该相应地调整脚本。


以下列表是POSIX mode生效时的更改内容:

  1. 当哈希表中的命令不再存在时,Bash将重新搜索$PATH以查找新位置。这也适用于“shopt -s checkhash”。
  2. 当作业以非零状态退出时,由作业控制代码打印并生成的消息为“Done(status)”。
  3. 作业控制代码打印的消息和作业停止时内置的消息是“Stopped(signame)”,其中,例如,SIGTSTP
  4. bg内置版使用所需的格式来描述放置在后台的每个作业,其中不包括作业是当前作业还是上一作业的指示。
  5. 在识别保留字的上下文中出现的保留字不会进行别名扩展。
  6. 启用了PS1PS2‘!’到历史记录编号和‘!!’‘!’的扩展,并对值执行了参数扩展无论PS1选项的设置如何,都为PS2promptvars
  7. 执行POSIX启动文件($ENV)而不是普通的Bash文件。
  8. Tilde扩展仅对命令名称之前的赋值执行,而不是对该行上的所有赋值语句执行。
  9. 默认历史记录文件为~/.sh_history(这是默认值$HISTFILE)。
  10. kill -l”的输出在一行上打印所有信号名称,以空格分隔,不带“SIG”前缀。
  11. kill内置版不接受带有“SIG”前缀的信号名称。
  12. 如果找不到.文件名中的文件名,则会退出非交互式shell。
  13. 如果算术扩展中的语法错误导致表达式无效,则非交互式shell将退出。
  14. 如果使用.source builtins读取的脚本中存在语法错误,或者eval内置处理的字符串中存在语法错误,则会退出非交互式shell。
  15. 重定向运算符不会对重定向中的单词执行文件名扩展,除非shell是交互式的。
  16. 重定向运算符不会在重定向中对单词执行分词。
  17. 函数名称必须是有效的shell名称。也就是说,它们可能不包含字母,数字和下划线以外的字符,并且可能不以数字开头。声明具有无效名称的函数会导致非交互式shell中出现致命语法错误。
  18. 在命令查找期间,在shell函数之前找到POSIX特殊内置函数。
  19. 时间保留字可以单独用作命令。以这种方式使用时,它会显示shell及其已完成子项的计时统计信息。 TIMEFORMAT变量控制定时信息的格式。
  20. 解析和扩展出现在双引号内的${...}扩展时,单引号不再特殊,不能用于引用右括号或其他特殊字符,除非运算符是定义为执行的运算符之一模式删除。在这种情况下,它们不必显示为匹配对。
  21. 如果下一个标记以‘-’开头,则解析器不会将时间识别为保留字。
  22. 如果POSIX特殊内置函数返回错误状态,则退出非交互式shell。致命错误是POSIX标准中列出的错误,包括传递错误选项,重定向错误,命令名称前面的赋值的变量赋值错误等等。
  23. 如果在赋值语句后面没有命令名称时发生变量赋值错误,则非交互式shell将退出并显示错误状态。例如,在尝试将值分配给只读变量时,会发生变量赋值错误。
  24. 如果在特殊内置命令之前的赋值语句中发生变量赋值错误,则存在错误状态的非交互式shell,但不包含任何其他简单命令。
  25. 如果for语句中的迭代变量或select语句中的选择变量是只读变量,则非交互式shell将以错误状态退出。
  26. 无法使用流程替换。
  27. 在内置完成后,POSIX特殊内置函数之前的赋值语句在shell环境中保留。
  28. shell函数调用之前的赋值语句在函数返回后在shell环境中持久存在,就好像已经执行了POSIX特殊内置命令一样。
  29. exportreadonly内置命令以POSIX所需的格式显示其输出。
  30. trap内置显示的信号名称不带前导SIG
  31. trap内置函数不检查可能的信号规范的第一个参数,如果是,则将信号处理恢复为原始处置,除非该参数仅由数字组成并且是有效的信号编号。如果用户想要将给定信号的处理程序重置为原始处置,则应使用‘-’作为第一个参数。
  32. .source内置组件在搜索PATH时找不到找到的文件名参数时,不搜索当前目录。
  33. 生成执行命令替换的子shell从父shell继承-e选项的值。当不处于POSIX模式时,Bash会清除此类子shell中的-e选项。
  34. 即使在非交互式shell中,也始终启用别名扩展。
  35. alias内置显示别名定义时,除非提供-p选项,否则它不会显示前导'别名'。
  36. 如果在没有选项的情况下调用set内置函数,则它不会显示shell函数名称和定义。
  37. 如果在没有选项的情况下调用set内置函数,它将显示不带引号的变量值,除非它们包含shell元字符,即使结果包含非打印字符。
  38. 在逻辑模式下调用cd内置函数,并且从$PWD构造的路径名和作为参数提供的目录名不引用现有目录时,cd将失败而不是回到物理模式。
  39. pwd builtin验证它打印的值是否与当前目录相同,即使没有要求它使用-P选项检查文件系统。
  40. 列出历史记录时,fc内置版不包含是否已修改历史记录条目的指示。
  41. fc使用的默认编辑器为ed
  42. 类型和命令builtins不会报告已找到的非可执行文件,但如果它是$PATH中唯一的命名文件,shell将尝试执行此类文件。
  43. vi编辑模式将在运行'v'命令时直接调用vi编辑器,而不是检查$VISUAL$EDITOR
  44. 启用xpg_echo选项时,Bash不会尝试将任何参数解释为echo作为选项。转换转义字符后,将显示每个参数。
  45. ulimit内置版使用-c-f选项的512字节块大小。
  46. SIGCHLD上设置陷阱时SIGCHLD的到达不会中断wait内置并导致它立即返回。对于退出的每个子项,trap命令运行一次。