質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

2回答

482閲覧

ShellCheckのドキュメントに書いてあるcd foo || ! echo "Failure"という書き方にはどのようなメリットがあるのでしょうか?

_kari_

総合スコア34

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2022/12/08 13:03

ShellCheckのドキュメントSC2164を読んでいたときに、よくわからない記載があったのでどなたか解説をいただきたいです。

SC2164のコンセプトは、シェルスクリプト内で「cdでカレントディレクトリを移動してから諸々コマンドを実行する」場合、cdが失敗した場合を想定して処理を書いておきましょう、というものだと理解しています。
ドキュメント内のコードそのままですが、例えば、

bash

1cd generated_files || exit 2rm -r *.c

と書いておけば、cdし損ねた状態でrm -rしてしまうリスクを回避できます。

ドキュメント内では具体的な対応例として

  • cd foo || exit as suggested to abort immediately, reusing exit code from failed cd command
  • cd foo || { echo "Failure"; exit 1; } abort with custom message
  • cd foo || ! echo "Failure" omitting "abort with custom message"
  • if cd foo; then echo "Ok"; else echo "Fail"; fi for custom handling
  • <(cd foo && cmd) as an alternative to <(cd foo || exit; cmd) in <(..), $(..) or ( )

が例示されています。
このうち、上から3つ目のcd foo || ! echo "Failure"という書き方の意図がよくわかりません。

omitting "abort with custom message"

という付記も、文意が今一つ読み取れませんでした。

物は試しと思い、cdが必ず失敗するようにして

bash

1cd foo || ! echo "Failure" 2echo "second line"

として実行してみたのですが、何がメリットなのかよくわかりませんでした。
cdに失敗したときだけ"Failure"が出力されるというのはわかりますが、後続のecho "second line"cdの成否に関わらず普通に実行されますし、!無しで

bash

1cd foo || echo "Failure" 2echo "second line"

と書くのと何が違うのかもわかりません。
(一応、cd foo || ! echo "Failure"cd foo || echo "Failure"でexit statusは変わりますが、後続の処理が走るのは変わらないし…)

cd foo || ! echo "Failure"の書き方にはどのようなメリットがあるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

exit statusは変わりますが

が目的でしょう。

!を付けないと、cd fooが成功しようが失敗しようがcd foo || echo "Failure"という行全体の終了コードは0です。

!を付けるとcd foo || ! echo "Failure"という行全体の終了コードはcd fooの終了コードを同じになります。

例えば、

Bash

1if cd foo || ! echo "Failure" 2then ~~~ 3else ~~~ 4fi

Bash

1if cd foo 2then ~~~ 3else echo "Failure" 4 ~~~ 5fi

は同じですが、何らかの理由で前者の方が見やすいケースがあるのかも知れません。

あるいは、

Bash

1mycd() { 2 cd "$@" || ! echo "Failure" 3}

のように関数を定義するとかですかね。
この場合もあえてこの書き方をしなくて良いと思いますが。

投稿2022/12/08 14:30

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下の通り、コマンドの実行結果が変化します。

sh

1$ cd foo || ! echo "Failure" 2$ echo $? 31 4 5$ cd foo || echo "Failure" 6$ echo $? 70

投稿2022/12/08 13:52

tkmtmkt

総合スコア1800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問