割り当てたのと同じ行で変数をエクスポートしないのはなぜですか?


44

から前のコマンドの最後の引数は何ですか?

shellcheckは、変数を割り当てる同じ行に変数をエクスポートしないように指示します。

なぜだろうか?

同じアドバイスはには適用されないaliasdeclareexportlocalreadonly、とtypeset




9
問題のシェルチェックルールはSC2155です。shellcheck wikiにはかなり良いドキュメントがあります
プネヘヘ

3
また、いくつかの古いシェルはexport一緒に受け入れて割り当てません。家宝のBourneシェルは、例えば、エラー「識別子でない= 2 FOO」を出力します。
デニスウィリアムソン

回答:


54

問題は、バッシュで、すべてのコマンドは、1の終了コードを持っていることです。いつexport foo="$(false)"の終了コードはfalse単に破棄されます。代わりに行う場合

foo="$(false)"
export foo

失敗した最初のコマンドは、たとえばerrexit設定によって対処できます。

export foo='bar'もちろんこのような文字列リテラルを宣言して割り当てることは、この問題の影響を受けません。しかし、変更はソフトウェア開発における唯一の不変のものであり、こうしたステートメントを分割することにより、将来性のあるステートメントを単純に管理するだけです。

割り当て固有のコマンドに加えて、1つの割り当てには複数のコマンドがありfoo="$(false)$(true)"ます(例:さらに別のそのようなトラップを参照pipefailman bashてください。

覚えておくべきもう1つのことは、宣言と割り当てのシーケンスが関連する場合があることです。たとえば、変数割り当てるに宣言する必要があります。(残念ながら、変数を初めて割り当てる前に変数を宣言することはできません。)local readonly


したがって、リテラルから変数を設定していて、破棄する終了コードがない場合、すべてを1行で実行しても問題はありません。
モンティハーダー

1
このshellcheckエラーに関する限り、いいえ。しかし、今削除された答えがそれらの間で半分正しくなったので、Bourneシェルはの代入構文をサポートしていなかったexportため、数年間、インタープリターがBourneシェルである可能性が高い場合、これを行うことについて知恵がありました。
JdeBP

@JdeBP、Bourneシェルがサポートをしたことに注意してfoo=$(cmd) export fooいるのと同じ注意点がかかわらず、cmdの終了ステータスが失われた(ただしで失敗した場合に終了するには、シェル原因でしれますset -e)。
ステファンシャゼラス

それは私の最初の文でカバーされました。
JdeBP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.