globのある変数に基づくスクリプトでは、rmまたはwgetが失敗します。

globのある変数に基づくスクリプトでは、rmまたはwgetが失敗します。

rmファイル名 glob またはwget.

Ubuntu 16.04では、次のことを行いました。

set -a
export drt="/var/www/html"
export pma="[pP][hH][pP][mM][yY][aA][dD][mM][iI][nN]"
set +a
echo $drt # Got the above.
echo $pma # Got the above.

その後、実行可能スクリプト(~/myScripts/tp_pma.sh)を実行しました。

#!/bin/bash
rm -rf ${drt}/${pma}*
wget -P ${drt} https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
unzip ${drt}/${pma}*.zip
mv ${drt}/${pma}*/ ${drt}/phpmyadmin/
rm ${drt}/${pma}*.zip

スクリプトが部分的に成功しました。

  1. 最初の操作がrm成功した可能性があり、以下の問題がすべて発生した可能性があります。
  2. 部分的に成功しましたwget。新しいPMAのコピーを含むzipファイルdrt
  3. 私はうまくいき、unzipzipを解凍し、最新のphpmyadminディレクトリを入手しました。
  4. 失敗しましたmv(下記のエラーを参照)。ディレクトリがphpMyAdmin-4.7.7-all-languages自分のホームディレクトリに残っているため、期待どおりにディレクトリが移動されず、名前も変更されませdrtん。phpmyadmin
  5. 最後のrm成功 - 私のホームディレクトリからzipが削除されました。

frエラーは発生しませんwget

そしてpmaなぜか値がphpMyAdmin-4.7.7-all-languages。私はそれをその値に変えませんでした。

ここで何が失敗する可能性があり、その理由は何ですか?

答え1

使用したコマンドは、アーカイブがある場所ではなく、実行中のディレクトリにunzipアーカイブを抽出します。unzipまず、アーカイブを含むディレクトリに変更するか、次を使用できます。-dオプション:

[-d exdir]
ファイルを抽出するオプションのディレクトリです。デフォルトでは、すべてのファイルとサブディレクトリは現在のディレクトリに再作成されます。

おそらくchdirオプションを選択します。

#!/bin/bash
cd "$drt"
rm -r ${pma}*
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
unzip phpMyAdmin-latest-all-languages.zip
mv ${pma}*/ phpmyadmin/
rm phpMyAdmin-latest-all-languages.zip

pmaまた、「値が何とか変更されました」と言ったとき、引用符なしで変数を使用するとphpMyAdmin-4.7.7-all-languagesファイル名パターンとして使用されますので、パターンと一致するファイルがあればecho $pma*既存ファイルの名前が表示されますのでご注意ください。

(大文字と小文字の区別モードが必要かどうかはわかりません。名前の形式がから変更されると予想する現実的な理由はありますかphpMyAdminphpmyadmin

答え2

代替スクリプトの提案:

#!/bin/sh -ex

destdir="/var/www/html/phpmyadmin"

tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT    # remove temporary directory on termination

wget -O "$tmpdir/archive.zip" \
    "https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip"

cd "$tmpdir" && {
    unzip archive.zip
    rm -f archive.zip

    # The only thing in the current (temporary) directory now is the
    # directory with the unpacked zip file.

    mkdir -p "$destdir"
    mv ./* "$destdir"/
}

アーカイブが名前付きサブディレクトリに抽出されると、phpMyAdmin-4.7.7-all-languagesスクリプトはその/var/www/html/phpmyadminアーカイブを移動してアーカイブの内容をから使用できるようにします/var/www/html/phpmyadmin/phpMyAdmin-4.7.7-all-languages

-exスクリプトの作成

  1. ユーティリティが失敗した場合は終了(-e
  2. 便利なトレース情報を出力します(-x)。

mvこのスクリプトを2回実行すると、同じ名前のディレクトリがターゲットの場所にすでに存在するため、最後の実行が失敗します。$destdirこのスクリプトは、以下の既存のディレクトリを変更しません。

スクリプトが完了するか、エラーで終了または終了すると、スクリプトはダウンロードしたアーカイブを保存し、解凍するために使用される一時ディレクトリを削除します。


このスクリプトのルートとセキュリティについて:

書き込みに root 権限が必要な場合は、$tmpdir次のようにします。いいえrootでスクリプトを実行してください!代わりにsudo最後の項目の前に挿入されますmv

私が知る限り、唯一の引数はあり、どの-typeコマンド$destdirでも使用されないため、誤って削除される危険はありません。rm $var1/$var2*実際に設定を解除する$destdirとスクリプトがmkdir

関連情報