誰負責提供set -o pipefail
我想在我的腳本中使用嚴格模式。我也會欣賞便攜性。
set -o pipefail似乎是強制性的。然而
shellcheck
(靜態 linter)對“在 POSIX sh 中,設置選項 pipefail 未定義”感到不滿。這是對的嗎?如果是這樣,這是一個
bash
單獨的功能還是相當多產?
pipefail
shell 選項特定於許多shellcheck
聲稱支持1的shell 。如果通過“可移植性”假設任何目標系統都有一個支持它的 shell(以及您可能正在使用的任何其他構造),則您可以使用此 shell 選項並且是可移植的。這與使用任何其他特定腳本語言獲得的“可移植性”類型相同。如果
shellcheck
linterset -o pipefail
在作為腳本的 shell 腳本中找到它,它會抱怨sh
,因為 POSIX 目前不支持它sh
。為確保您的腳本是由
bash
shell(或您正在編碼的任何特定 shell)解釋的腳本,腳本應該有一個#!
-line 指向正確的 shell 解釋器,例如,#!/bin/bash
或者可能
#!/usr/bin/env bash
或類似的東西。
使用適當的
#!
-line 還表明腳本將由不是的特定 shell 解釋sh
,shellcheck
linter 不會抱怨您pipefail
在腳本中設置 shell 選項。如果您不在
#!
腳本中使用 -line,那麼您應該考慮這樣做(或始終在命令行上使用顯式解釋器執行您的腳本)。同時,shellcheck
可以告訴命令行工具使用其-s
(或--shell=
)選項切換到模式:shellcheck --shell=bash myscript
1我懷疑
shellcheck
有一個“POSIXsh
模式”和一個“其他模式”來支持bash
,dash
和ksh
(shellcheck
不聲稱支持zsh
)。pipefail
shell 選項被記錄為與bash
, 和一起使用ksh
。zsh
shell 有一個PIPE_FAIL
shell 選項,可以用同樣的方式設置。dash
shell 不支持該選項,但如果-line#!
提到dash
,shellcheck
則不會抱怨pipefail
.
該
pipefail
選項來自 ksh93,並且也存在於其他一些 shell 中。它被添加:
- 到1998 年發布的ksh93g
- 2004 年發布的bash 3.0
- 2009 年的busybox ash
- 在 2010 年讓busybox 安靜下來
- 到2013 年發布的 mksh r46
- 到2013 年發布的zsh 5.0.3
- to yash 2.42於 2016 年發布
- 2017 年到 NetBSD sh
- 2019 年到 FreeBSD sh
- 2020 年到 OpenBSD sh
2013 年送出了將其添加到 POSIX 標準的請求,並於 2019 年接受了一項決議。因此,它將在即將到期的標準的下一個主要修訂版中(最遲 2022 年)。
其餘實現(主要是基於 dash、bosh 和 ksh88 的 shell)可能仍需要更多時間來添加對它的支持。之後“EOL”時鐘將開始滴答作響,10 年後您將能夠假設目前支持的系統上的所有 sh 實現都將支持它。