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
スクリプトが部分的に成功しました。
- 最初の操作が
rm
成功した可能性があり、以下の問題がすべて発生した可能性があります。 - 部分的に成功しました
wget
。新しいPMAのコピーを含むzipファイルdrt
。 - 私はうまくいき、
unzip
zipを解凍し、最新のphpmyadminディレクトリを入手しました。 - 失敗しました
mv
(下記のエラーを参照)。ディレクトリがphpMyAdmin-4.7.7-all-languages
自分のホームディレクトリに残っているため、期待どおりにディレクトリが移動されず、名前も変更されませdrt
ん。phpmyadmin
- 最後の
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*
既存ファイルの名前が表示されますのでご注意ください。
(大文字と小文字の区別モードが必要かどうかはわかりません。名前の形式がから変更されると予想する現実的な理由はありますかphpMyAdmin
?phpmyadmin
)
答え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
スクリプトの作成
- ユーティリティが失敗した場合は終了(
-e
) - 便利なトレース情報を出力します(
-x
)。
mv
このスクリプトを2回実行すると、同じ名前のディレクトリがターゲットの場所にすでに存在するため、最後の実行が失敗します。$destdir
このスクリプトは、以下の既存のディレクトリを変更しません。
スクリプトが完了するか、エラーで終了または終了すると、スクリプトはダウンロードしたアーカイブを保存し、解凍するために使用される一時ディレクトリを削除します。
このスクリプトのルートとセキュリティについて:
書き込みに root 権限が必要な場合は、$tmpdir
次のようにします。いいえrootでスクリプトを実行してください!代わりにsudo
最後の項目の前に挿入されますmv
。
私が知る限り、唯一の引数はあり、どの-typeコマンド$destdir
でも使用されないため、誤って削除される危険はありません。rm $var1/$var2*
実際に設定を解除する$destdir
とスクリプトがmkdir
。