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
失败,因为目标位置已存在同名目录。$destdir
此脚本不会修改下面的现有目录。
当脚本完成、因错误而终止或被终止时,脚本将删除用于存储和解压下载的存档的临时目录。
关于此脚本中的 root 和安全性:
如果需要 root 权限才能写入,$tmpdir
则执行以下操作不是以 root 身份运行脚本!而是插入到sudo
最后一个前面mv
。
据我所知,不存在任何意外删除的风险,因为唯一的参数是$destdir
并且它从未在任何rm $var1/$var2*
-type 命令中使用。事实上,取消设置$destdir
将使脚本在mkdir
.