Shell-Script

誰負責提供set -o pipefail

  • June 21, 2021

我想在我的腳本中使用嚴格模式。我也會欣賞便攜性。

set -o pipefail似乎是強制性的。然而shellcheck(靜態 linter)對“在 POSIX sh 中,設置選項 pipefail 未定義”感到不滿。

這是對的嗎?如果是這樣,這是一個bash單獨的功能還是相當多產?

pipefailshell 選項特定於許多shellcheck聲稱支持1的shell 。如果通過“可移植性”假設任何目標系統都有一個支持它的 shell(以及您可能正在使用的任何其他構造),則您可以使用此 shell 選項並且是可移植的。這與使用任何其他特定腳本語言獲得的“可移植性”類型相同。

如果shellchecklinterset -o pipefail在作為腳本的 shell 腳本中找到它,它會抱怨sh,因為 POSIX 目前不支持它sh

為確保您的腳本是由bashshell(或您正在編碼的任何特定 shell)解釋的腳本,腳本應該有一個#!-line 指向正確的 shell 解釋器,例如,

#!/bin/bash

或者可能

#!/usr/bin/env bash

或類似的東西。

使用適當的#!-line 還表明腳本將由不是的特定 shell 解釋shshellchecklinter 不會抱怨您pipefail在腳本中設置 shell 選項。

如果您不在#!腳本中使用 -line,那麼您應該考慮這樣做(或始終在命令行上使用顯式解釋器執行您的腳本)。同時,shellcheck可以告訴命令行工具使用其-s(或--shell=)選項切換到模式:

shellcheck --shell=bash myscript

1我懷疑shellcheck有一個“POSIXsh模式”和一個“其他模式”來支持bash,dashksh(shellcheck不聲稱支持zsh)。pipefailshell 選項被記錄為與bash, 和一起使用kshzshshell 有一個PIPE_FAILshell 選項,可以用同樣的方式設置。dashshell 不支持該選項,但如果-line#!提到dashshellcheck則不會抱怨pipefail.

pipefail選項來自 ksh93,並且也存在於其他一些 shell 中。它被添加:

2013 年送出了將其添加到 POSIX 標準的請求,並於 2019 年接受了一項決議。因此,它將在即將到期的標準的下一個主要修訂版中(最遲 2022 年)。

其餘實現(主要是基於 dash、bosh 和 ksh88 的 shell)可能仍需要更多時間來添加對它的支持。之後“EOL”時鐘將開始滴答作響,10 年後您將能夠假設目前支持的系統上的所有 sh 實現都將支持它。

引用自:https://unix.stackexchange.com/questions/654885