Vor*_*rac 1 shell-script portability
我想在我的脚本中使用严格模式。我也很欣赏便携性。
set -o pipefail似乎是强制性的。然而shellcheck
(静态 linter)对“在 POSIX sh 中,设置选项 pipefail 未定义”感到不满。
这是正确的吗?如果是这样,这是一个bash
单独的功能还是相当多产?
所述pipefail
壳的选择是特定于数弹其shellcheck
权利要求,以支持1。如果通过“可移植性”假设任何目标系统都有支持它的 shell(以及您可能正在使用的任何其他构造),则您可以使用此 shell 选项并具有可移植性。这与您使用任何其他特定脚本语言获得的“可移植性”类型相同。
该shellcheck
棉短绒会抱怨,如果它发现set -o pipefail
在一个shell脚本,是一个sh
脚本,因为它目前不支持POSIX sh
。
为确保您的脚本是由bash
shell(或您正在编码的任何特定 shell)解释的脚本,脚本应该有一个#!
-line 指向正确的 shell 解释器,例如,
#!/bin/bash
Run Code Online (Sandbox Code Playgroud)
或者可能
#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)
或类似的东西。
使用适当的#!
-line 额外指示脚本将由不是 的特定 shell 解释sh
,shellcheck
linter 不会抱怨您pipefail
在脚本中设置了shell 选项。
如果您不在#!
脚本中使用-line,那么您应该考虑这样做(或始终在命令行上使用显式解释器运行您的脚本)。同时,shellcheck
可以告诉命令行工具使用其-s
(或--shell=
)选项切换到模式:
shellcheck --shell=bash myscript
Run Code Online (Sandbox Code Playgroud)
1我怀疑shellcheck
具有“POSIXsh
模式”和“其他模式”来支持bash
,dash
以及ksh
(shellcheck
并不声称支持zsh
)。该pipefail
外壳选项文件一起工作bash
,和ksh
。该zsh
外壳有一个PIPE_FAIL
能以同样的方式来设置shell选项。在dash
外壳不支持的选项,但如果#!
直插提到dash
,shellcheck
不会抱怨pipefail
。
该pipefail
选项来自 ksh93,也存在于其他一些 shell 中。添加了:
一个将其添加到POSIX标准的要求是在2013年提交,一项决议,2019年接受因此,这将是在标准即将到期(2022最晚)的下一个主要版本。
剩余的实现(主要是基于 dash、bosh 和 ksh88 的 shell)可能仍需要更多时间来添加对它的支持。之后“EOL”时钟将开始滴答作响,10 年后您将能够假设当前支持的系统上的所有 sh 实现都将支持它。