rm 或 wget 在基于带有 glob 的变量的脚本中失败

rm 或 wget 在基于带有 glob 的变量的脚本中失败

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. 成功unzip了,zip 被解压,我得到了最新的 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失败,因为目标位置已存在同名目录。$destdir此脚本不会修改下面的现有目录。

当脚本完成、因错误而终止或被终止时,脚本将删除用于存储和解压下载的存档的临时目录。


关于此脚本中的 root 和安全性:

如果需要 root 权限才能写入,$tmpdir则执行以下操作不是以 root 身份运行脚本!而是插入到sudo最后一个前面mv

据我所知,不存在任何意外删除的风险,因为唯一的参数是$destdir并且它从未在任何rm $var1/$var2*-type 命令中使用。事实上,取消设置$destdir将使脚本在mkdir.

相关内容