在带有 Bash 的 Ubuntu 16.04 中,当我没有便捷的方法来升级所有 WordPress 组件(核心、翻译、主题、插件)时,我遇到了问题,我使用以下代码来解决它:
cat <<-EOF > /etc/cron.daily/cron_daily
#!/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
rse
popd
fi
done
EOF
我想问的其实是以下几个问题:
该变量与同一行中紧随其后的
dir
星号 ( )有何相似之处(Bash 解释器如何知道代表其中的每个目录?*
dir
/var/www/html
pushd
-popd
序列(?)在这里如何工作?我将其理解为“如果您位于类似于 for 循环的每次迭代的 $dir 内部,请执行某些操作”。
答案1
dir 变量与
*
同一行中紧随其后的星号 () 有何相似之处(Bash 解释器如何知道$dir
[迭代地] 代表其中的每个目录/var/www/html/
?
巴什就是这样壳球工作/行为,但你误解了一件事:dir/*
是一个 glob,其中包括全部文件之内dir
,不仅仅是所有目录:在 POSIX 环境中,目录是文件类型pushd
,但在这种情况下,只有目录与 for 循环和后续的-对相关popd
。
pushd
-popd
序列(?)在这里如何工作?我把它理解为“如果你在$dir
类似于 for 循环的每次迭代的内部,做一些事情”。
pushd
和popd
是一对使用称为“堆栈”的数据结构的工具。想象一下一个弹簧分配器,就像一个佩兹分配器。
如果你推将一个物品放到一堆中,您将其存储以供以后使用,例如将一个“药丸”推入 Pez 分配器的顶部。
如果你流行音乐堆栈中的一项,您将其取出以供使用或参考。这会将其从堆栈中删除。
看一下此行为,了解如何工作的简单pushd
示例popd
:
$ pwd
/home/myuser
$ pushd /etc
/etc ~
$ pwd
/etc
$ pushd /usr/local
/usr/local /etc ~
$ pwd
/usr/local
$ popd
/etc ~
$ pwd
/etc
$ popd
~
$ pwd
/home/myuser
你的for
循环基本上是这样工作的如果我可以将这个目录推入目录堆栈,那么这首先意味着该目录现在存在,其次该目录现在是当前工作目录。它将继续执行工作,然后popd
返回到之前所在的位置,然后运行循环的下一次迭代。