「set -opipelinefail」の提供を担当する人は誰ですか?

「set -opipelinefail」の提供を担当する人は誰ですか?

私のスクリプトで厳格なモードを使用したいと思います。携帯性も認めます。

set -o パイプラインの失敗必須のようです。ただし、shellcheck(静的リンター)は、「POSIX shでパイプライン障害設定オプションが定義されていません」という内容に満足していません。

そうなんですか?それでは、これは単なるbash機能なのでしょうか、それともかなり豊富なのでしょうか?

答え1

このpipefailオプションはksh93で提供されており、他のいくつかのシェルにもあります。追加:

POSIX 標準に追加するよう依頼2013年に提出され、2019年に決議案が承認されました。したがって、これは標準の次の主要な改訂版に属します。

残りの実装(主にダッシュ、bosh、およびksh88ベースのシェル)のサポートを追加するには、まだ時間がかかります。その後、「EOL」クロックが動作を開始し、10年後には、現在サポートされているシステムのすべてのsh実装がそれをサポートすると仮定できます。

答え2

シェルオプションは、1をサポートすると主張するpipefail多くのシェルにのみ適用されます。 「移植性」によって、ターゲットシステムがそれをサポートするシェル(および利用可能な他の構成)を持つと仮定する場合は、このシェルオプションを使用して移植性を取得できます。これは、他の特定のスクリプト言語から取得できるのと同じタイプの「移植性」です。shellcheck

linterがシェルスクリプト内でスクリプトを見つけると、shellcheckPOSIXは現在それをサポートしていないため、苦情を表示します。set -o pipefailshsh

bashスクリプトがシェル(またはコーディングする特定のシェル)によって解釈されるスクリプトであることを確認するには、スクリプトに#!正しいシェルソルバーを指す -line が必要です。例:

#!/bin/bash

または多分

#!/usr/bin/env bash

またはそのようなもの。

正しい#!行を使用すると、スクリプトが解釈されない特定のシェルによって解釈され、linterがスクリプトに設定したシェルオプションについて文句を言わないことをさらにsh示しますshellcheckpipefail

#!スクリプトで-lineを使用していない場合は、それを考慮する必要があります(または常に明示的なインタプリタを使用してコマンドラインからスクリプトを実行する必要があります)。同時に、shellcheckコマンドラインツールに対応する(または)オプションを使用してモードに切り替えるように指示できます。-s--shell=

shellcheck --shell=bash myscript

1 およびサポートすると主張されていない)をサポートする「POSIXモード」と「その他モード」があるようです。 、およびで使用するためのシェルオプションが文書化されています。シェルには同じ方法で設定できるシェルオプションがあります。シェルはこのオプションをサポートしていませんが、-lineが言及されていても文句はありません。shellcheckshbashdashkshshellcheckzshpipefailbashkshzshPIPE_FAILdash#!dashshellcheckpipefail

答え3

サポートされていないシェルでスクリプトが実行されたときに何が起こりたいですかpipefail

結果の順序が重要です一部しかし、殻はすべてではありません。単一のコマンド内でもbashは順序を考慮します。 VSが終了するsetまで続きます。set -o NoSuchOption -eset -e -o NoSuchOption

関連情報