🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
シェルスクリプト

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

シェル

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

Q&A

解決済

2回答

2731閲覧

各コマンドと追従するオプションやシェルスクリプトを調べても動作がわからない

ilovearchlinux

総合スコア15

シェルスクリプト

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

シェル

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

0グッド

1クリップ

投稿2020/12/12 13:34

編集2020/12/12 14:25

# 経緯
他者のlinuxのインストールスクリプトを参考に色々と拝見しており、シェルスクリプトをmanやwebで調べて上から下まで完璧に理解しようとしている次第です。ちなみに全然書けもせず基本中の基本しか知らない程度です。
そこで下記以外にもリダイレクト関連や/dev/nullなりに渡す処理の動作がいまいち理解できません。

shell

1umount -R /mnt 2> /dev/null || true 2cryptsetup luksClose luks 2> /dev/null || true

# 自分の調べた結果の認識

umount -R /mnt:再帰的に/mntをアンマウント

  • umount:これは単純にアンマウントコマンド
  • -R:再帰的にアンマウントするオプション(らしい)

###2> /dev/null:標準エラー出力を/dev/nullに渡す

  • 2> file:標準エラー出力をfileに渡す
  • /dev/null:出力が破棄される

**Q1:/dev/nullに標準エラーを渡すというのはエラーを無視する(捨てるため)ということなのでしょうか?**⇒解決済み

###|| true:論理和及び片方true

  • ||:論理和

Q2:論理和(command1||command2)に置いてcommand1がfalseにしろtrueにしろcommand2(true)に行くわけですが、何故このように記述したのだろう?また2> /dev/nullの真偽の判定もわからないです⇒解決済み

Q3:スクリプトの初期の方にこれを記述されているのですが、何故/mntのアンマウント及び暗号化パーティションを閉じるチェックをしたのでしょう?
要するにcommand1で確認してOKなら2に行かず1実行で終え、1で/mntされてませんよ等のエラーがでたらcommand2のtrueで次に進むということだと思うんですが何故どのみちtrueになるのに確認したのでしょう?

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

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

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

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

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

guest

回答2

0

ベストアンサー

Q1:/dev/nullに標準エラーを渡すというのはエラーを無視する(捨てるため)ということなのでしょうか?

「エラーを無視する」と「エラーメッセージを無視する」は違います。
これは、後者です。
Q2で説明する|| trueが「エラーを無視する」ですね。

Q2:論理和(command1||command2)に置いてcommand1がfalseにしろtrueにしろcommand2(true)に行くわけですが、何故このように記述したのだろう?

単独コマンドでは、こういう|| trueは無意味です。
おそらくこれより前の段階で、set -eを実行していると思います。このset -eは、「コマンドがリターンコード0以外で終了したら、スクリプトの実行をそこで中断する」という意味です(厳密な説明じゃないので詳しくはman bashを)。
つまり、

Bash

1set -e 2umount -r /mnt 3cryptsetup luksClose luks

であれば、umountのリターンコードが非ゼロ(失敗)の場合は、cryptsetup以降は実行されません。

Bash

1set -e 2umount -r /mnt || true 3cryptsetup luksClose luks || true

だと、コマンドが失敗してもスクリプトが続行します。

そもそも、set -eを書かずに、

Bash

1umount -r /mnt 2cryptsetup luksClose luks

と書けば、同じく、コマンドが失敗してもスクリプトは続行しますが。

私は今まで使ったこと無いですが、set -eを好む人もいるようです。

投稿2020/12/12 14:35

otn

総合スコア85882

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

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

ilovearchlinux

2020/12/12 15:10

set -eは記述されていませんでした。 変わりにset -uo pipefailが記述されていました。
otn

2020/12/12 15:15

であれば、|| true は、全く無意味です。(最後に実行するコマンドで無い限り) ・意味をよく分からず書いている ・set -eを付けていたときに書いて、set -eを消した際にそのままにした(害は無いので) のどちらかでしょう。
ilovearchlinux

2020/12/12 15:18

なるほど ありがとう御座います。
guest

0

2> /dev/null:標準エラー出力を/dev/nullに渡す
Q1:/dev/nullが0なので/dev/nullに標準エラーを渡すというのはエラーを無視するということなのでしょうか?
=> 標準エラーに出力されたものを /dev/null に捨てる(表示させない)ということ。無視ではない。

|| true:論理和及び片方true
||:論理和
Q2:論理和(command1||command2)に置いてcommand1がfalseにしろtrueにしろcommand2(true)に行くわけですが、何故このように記述したのだろう?また 2> /dev/nullの真偽の判定もわからない
=> command1 が失敗しても true (成功) を返す

command 2> /dev/null || true で command のエラーを無視する ということになります。

投稿2020/12/12 13:40

scsi

総合スコア2840

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

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

ilovearchlinux

2020/12/12 13:47

なるほど ちなみに初期の方にこれを記述されているのですが、何故/mntのアンマウント及び暗号化パーティションを閉じるチェックをしたのでしょう? 要するにcommand1で確認してOKなら2に行かず1実行で終え、1で/mntされてませんよ等のエラーがでたらcommand2のtrueで次に進むということだと思うんですが
scsi

2020/12/12 14:20

私が作成したものではないので意図は分かりません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問