私のスクリプトで厳格なモードを使用したいと思います。携帯性も認めます。
set -o パイプラインの失敗必須のようです。ただし、shellcheck
(静的リンター)は、「POSIX shでパイプライン障害設定オプションが定義されていません」という内容に満足していません。
そうなんですか?それでは、これは単なるbash
機能なのでしょうか、それともかなり豊富なのでしょうか?
答え1
このpipefail
オプションはksh93で提供されており、他のいくつかのシェルにもあります。追加:
- toksh93g1998年発売
- コック2004年にリリースされた3.0
- 2009年からビジーボックスアッシュまで
- 2010年にはビジーボックスで静かになりました。
- mkshへr46は2013年にリリースされました。
- zshによる2013年5.0.3リリース
- ヤッシュ2.422016年発売
- 2017年にNetBSD shに移行
- 2019年にFreeBSD shに移行
- 2020年にOpenBSD shにアップグレード
ㅏPOSIX 標準に追加するよう依頼2013年に提出され、2019年に決議案が承認されました。したがって、これは標準の次の主要な改訂版に属します。
残りの実装(主にダッシュ、bosh、およびksh88ベースのシェル)のサポートを追加するには、まだ時間がかかります。その後、「EOL」クロックが動作を開始し、10年後には、現在サポートされているシステムのすべてのsh実装がそれをサポートすると仮定できます。
答え2
シェルオプションは、1をサポートすると主張するpipefail
多くのシェルにのみ適用されます。 「移植性」によって、ターゲットシステムがそれをサポートするシェル(および利用可能な他の構成)を持つと仮定する場合は、このシェルオプションを使用して移植性を取得できます。これは、他の特定のスクリプト言語から取得できるのと同じタイプの「移植性」です。shellcheck
linterがシェルスクリプト内でスクリプトを見つけると、shellcheck
POSIXは現在それをサポートしていないため、苦情を表示します。set -o pipefail
sh
sh
bash
スクリプトがシェル(またはコーディングする特定のシェル)によって解釈されるスクリプトであることを確認するには、スクリプトに#!
正しいシェルソルバーを指す -line が必要です。例:
#!/bin/bash
または多分
#!/usr/bin/env bash
またはそのようなもの。
正しい#!
行を使用すると、スクリプトが解釈されない特定のシェルによって解釈され、linterがスクリプトに設定したシェルオプションについて文句を言わないことをさらにsh
示しますshellcheck
。pipefail
#!
スクリプトで-lineを使用していない場合は、それを考慮する必要があります(または常に明示的なインタプリタを使用してコマンドラインからスクリプトを実行する必要があります)。同時に、shellcheck
コマンドラインツールに対応する(または)オプションを使用してモードに切り替えるように指示できます。-s
--shell=
shellcheck --shell=bash myscript
1 、および(サポートすると主張されていない)をサポートする「POSIXモード」と「その他モード」があるようです。 、およびで使用するためのシェルオプションが文書化されています。シェルには同じ方法で設定できるシェルオプションがあります。シェルはこのオプションをサポートしていませんが、-lineが言及されていても文句はありません。shellcheck
sh
bash
dash
ksh
shellcheck
zsh
pipefail
bash
ksh
zsh
PIPE_FAIL
dash
#!
dash
shellcheck
pipefail
答え3
サポートされていないシェルでスクリプトが実行されたときに何が起こりたいですかpipefail
?
結果の順序が重要です一部しかし、殻はすべてではありません。単一のコマンド内でもbashは順序を考慮します。 VSが終了するset
まで続きます。set -o NoSuchOption -e
set -e -o NoSuchOption