Como o pushd funciona?

0

No Ubuntu 16.04 com Bash, tive um problema quando não tinha uma maneira conveniente de atualizar todos os meus componentes do WordPress (núcleo, traduções, tema, plug-in) e usei o seguinte código para resolvê-lo:

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

O que eu gostaria de perguntar é, na verdade, composto por estas perguntas:

  1. Como a variável dir se assemelha ao asterisco ( * ) vindo um pouco depois dele na mesma linha (como o interpretador Bash sabe que dir representa cada diretório dentro de /var/www/html ?

  2. Como funciona a sequência pushd - popd (?) aqui? Eu entendo que "se você está dentro de $ dir, que se assemelha a cada iteração do loop for, faça coisas".

por user9303970 14.03.2018 / 17:32

1 resposta

3

How does the dir variable resembles the asterisk (*) coming a little bit after it in the same line (how is the Bash interpreter knows that $dir [iteratively] represents each directory inside /var/www/html/?

É como o Bash shell globs funciona / se comporta, mas você está enganado sobre uma coisa: dir/* é um glob que inclui todos os arquivos dentro de dir , não apenas todos os diretórios: em um ambiente POSIX, os diretórios são um tipo de arquivo , mas neste caso apenas diretórios são relevantes para o for loop e o par subsequente pushd - popd .

How does the pushd-popd sequence(?) works here? I understand it to "if you are inside $dir which resembles each iteration of the for loop, do stuff".

pushd e popd são um par de ferramentas que funcionam com uma estrutura de dados conhecida como "pilha". Imagine um dispensador com mola, como um dispensador Pez .

Se você empurrar um item em uma pilha, você está armazenando-o para uso posterior, como empurrar uma 'pílula' para o topo do dispensador Pez.

Se você pop um item de uma pilha, você está tirando para uso ou referência. Isso remove da pilha.

Veja este comportamento para ver um exemplo simples de como pushd e popd work:

$ 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

Seu for loop basicamente funciona dizendo if Eu posso empurrar este diretório para a pilha de diretórios, então isso significa primeiramente que o diretório agora existe, e em segundo lugar que esse diretório é o atual trabalho diretório. Ele continuará fazendo o trabalho e, em seguida, popd para voltar para onde quer que tenha sido antes e, em seguida, executará a próxima iteração do loop.

    
por 14.03.2018 / 18:03