Pushd 是如何工作的?

Pushd 是如何工作的?

在带有 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

我想问的其实是以下几个问题:

  1. 该变量与同一行中紧随其后的dir星号 ( )有何相似之处(Bash 解释器如何知道代表其中的每个目录?*dir/var/www/html

  2. pushd-popd序列(?)在这里如何工作?我将其理解为“如果您位于类似于 for 循环的每次迭代的 $dir 内部,请执行某些操作”。

答案1

dir 变量与*同一行中紧随其后的星号 () 有何相似之处(Bash 解释器如何知道$dir[迭代地] 代表其中的每个目录/var/www/html/

巴什就是这样壳球工作/行为,但你误解了一件事:dir/*是一个 glob,其中包括全部文件之内dir,不仅仅是所有目录:在 POSIX 环境中,目录是文件类型pushd,但在这种情况下,只有目录与 for 循环和后续的-对相关popd

pushd-popd序列(?)在这里如何工作?我把它理解为“如果你在$dir类似于 for 循环的每次迭代的内部,做一些事情”。

pushdpopd是一对使用称为“堆栈”的数据结构的工具。想象一下一个弹簧分配器,就像一个佩兹分配器

如果你将一个物品放到一堆中,您将其存储以供以后使用,例如将一个“药丸”推入 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返回到之前所在的位置,然后运行循环的下一次迭代。

相关内容