Pushd-popdディレクトリリストを繰り返すときにif-fiセクションが必要ですか?

Pushd-popdディレクトリリストを繰り返すときにif-fiセクションが必要ですか?

私は次のコードを使用します。このスクリプト私はこれを使ってWordPressサイトを更新します。

#!/bin/bash
drt="/var/www/html"
for dir in ${drt}/*/; do
    if pushd "$dir"; then
        wp plugin update --all --allow-root
        wp core update --allow-root
        wp language core update --allow-root
        wp theme update --all --allow-root
    popd
    fi
done

すべてのWordPressインスタンスを一度に更新する方法を探している間、このコードで使用されている特定のパターンについて学びましたpushdpopd

このコードにセグメントが含まれている理由は不明ですif-fi

私の質問

基本的に、同じパターンを持つがif-fiセグメントがないように構文を何とか変更できますか?

たとえば、次のように変更します。

if pushd "$dir";
popd
    commands
fi

私は次の疑似コードを持っています:

pushd "$dir";
    commands
popd

私はこれをなぜ尋ねますか?

if-fi宣言(擬似コード)なしで、コンピュータに次のように話す方法を想像できます。

for dir in ${drt}/*; do pushd "$drt"; then
    commands
popd

ノート

  1. 答えに他のアプローチを含めることもできます(つまり、まったく含まれていません)pushdpopd

  2. 関連質問

ベストアンサー1

また@Olorinによる投稿ここには少し誤解がある可能性があると思います。まずfor y in ${x}/*; do pushd "$y"; then、結果は

bash:予期しないトークン「then」の近くに構文エラーがあります。


第二に、インデントが誤解を招く可能性があります。実際に起こったことについて。元のコードの正しい形式のバージョン:

for y in ${x}/*/
do
    if pushd "$y"
    then
        command1
        command2
        popd
    fi
done

つまり、みんな command1、初期成功が発生した場合command2にのみ実行されます。代わりに書くならpopdpushd

for y in ${x}/*/
do
    pushd "$y"
    command1
    command2
    popd
done

そして、errexitガードがなければ、失敗pushdや失敗はpopdスクリプトの残りの部分に影響を与えません。これにより、間違ったディレクトリが実行され、command1入力されて別のディレクトリに戻る可能性があります。command2このコードとは何の関係もありません。これは悲惨な結果につながる可能性があります。


最後に言いたいことはpushd+コマンド+はpopdアンチパターンです言語にさらに多くのコンテキスト(したがって認知的オーバーヘッドとリスク)を追加し、複雑なコンテキストがすでに大きな問題であるためです。この問題を解決する最も一般的な方法は、次のようにコマンドにパス(絶対パスを推奨)を渡すことです。

for y in "$x"/*/
do
    command1 "$y"
    command2 "$y"
done

おすすめ記事