谁负责提供`set -o pipefail`

Vor*_*rac 1 shell-script portability

我想在我的脚本中使用严格模式。我也很欣赏便携性。

set -o pipefail似乎是强制性的。然而shellcheck(静态 linter)对“在 POSIX sh 中,设置选项 pipefail 未定义”感到不满。

这是正确的吗?如果是这样,这是一个bash单独的功能还是相当多产?

Kus*_*nda 6

所述pipefail壳的选择是特定于数弹其shellcheck权利要求,以支持1。如果通过“可移植性”假设任何目标系统都有支持它的 shell(以及您可能正在使用的任何其他构造),则您可以使用此 shell 选项并具有可移植性。这与您使用任何其他特定脚本语言获得的“可移植性”类型相同。

shellcheck棉短绒会抱怨,如果它发现set -o pipefail在一个shell脚本,是一个sh脚本,因为它目前不支持POSIX sh

为确保您的脚本是由bashshell(或您正在编码的任何特定 shell)解释的脚本,脚本应该有一个#!-line 指向正确的 shell 解释器,例如,

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

或者可能

#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)

或类似的东西。

使用适当的#!-line 额外指示脚本将由不是 的特定 shell 解释shshellchecklinter 不会抱怨您pipefail在脚本中设置了shell 选项。

如果您不在#!脚本中使用-line,那么您应该考虑这样做(或始终在命令行上使用显式解释器运行您的脚本)。同时,shellcheck可以告诉命令行工具使用其-s(或--shell=)选项切换到模式:

shellcheck --shell=bash myscript
Run Code Online (Sandbox Code Playgroud)

1我怀疑shellcheck具有“POSIXsh模式”和“其他模式”来支持bashdash以及kshshellcheck并不声称支持zsh)。该pipefail外壳选项文件一起工作bash,和ksh。该zsh外壳有一个PIPE_FAIL能以同样的方式来设置shell选项。在dash外壳不支持的选项,但如果#!直插提到dashshellcheck不会抱怨pipefail


Sté*_*las 6

pipefail选项来自 ksh93,也存在于其他一些 shell 中。添加了:

一个将其添加到POSIX标准的要求是在2013年提交,一项决议,2019年接受因此,这将是在标准即将到期(2022最晚)的下一个主要版本。

剩余的实现(主要是基于 dash、bosh 和 ksh88 的 shell)可能仍需要更多时间来添加对它的支持。之后“EOL”时钟将开始滴答作响,10 年后您将能够假设当前支持的系统上的所有 sh 实现都将支持它。