Quando eu apertei enter neste
(cd <somewhere>/; ls -gG S09E03*
Eu esperava um erro por não ser um diretório com nenhum arquivo correspondente S09E03*
(verifiquei isso), mas o comando mostrou informações sobre o arquivo sobre o qual eu queria informações.
Portanto, parece que meu shell (zsh em um Debian Buster corrigido, ou seja, versão 5.7.1) não fez o globbing até que estivesse no diretório correto (ou seja, após o cd
). cd
é um build-in (basicamente tem que ser), então acho que o shell sabia onde eu queria que isso acontecesse?
Estou totalmente fora? Em vez disso, tem algo a ver com o subshell - (cd <somewhere1>; ls -l <prefix>*; cd <somewhere2>; ls -l <prefix>*)
mostra informações sobre dois arquivos diferentes, então acho que não, mas posso estar errado (de novo)? Ou é outra coisa que atrasa o globbing (respeito ao que eu pensava.
<somewhere>
é bastante longo, então eu estava tentando evitar esse caminho na saída dels
ls -gG
pois sabia que o dono e grupo dos arquivos seriam diferentes entre os arquivos queria comparar alguns atributos de
Shells (não apenas zsh) terminam de analisar um comando antes de expandi -lo e depois executá -lo.
;
,&
,|
, etc.) e, para um comando simples, realiza atribuições de parâmetros , redirecionamentos e expansões da esquerda para a direita.Observe que estou apenas dando uma visão geral muito geral aqui. Alguns casos de canto podem ser complicados e são dependentes de shell, não vou entrar nesses casos neste post.
Quando dado
(cd subdir/; ls -gG S09E03*)
, o shell primeiro o analisa para obter o seguinte resultado:cd
,subdir/
(nenhuma com caracteres entre aspas).ls
,-gG
,S09E03*
(nenhuma com caracteres entre aspas).Este é o mesmo trabalho que o shell faria, por exemplo, se estivesse processando uma definição de função
Depois de analisar o comando, o shell o executa. Ele cria um subshell para a construção do subshell. Dentro do subshell, ele primeiro expande, em seguida, executa o primeiro comando simples, depois expande e executa o segundo comando. O diretório atual muda para
subdir/
durante a execução do primeiro comando simples. A expansão deS09E03*
, que é onde ocorre uma etapa de globbing, acontece mais tarde.A propósito, o subshell é apenas um detalhe que não muda nada. O que importa é que
;
separe dois comandos, e o primeiro comando seja executado antes do segundo.Não é que “o shell sabia onde eu queria que isso acontecesse” – está acontecendo onde está acontecendo. A expansão de um argumento de comando sempre acontece no mesmo diretório que o próprio comando (nenhuma parte da execução de um comando pode alterar seu diretório atual, exceto a etapa final que pode invocar um builtin para fazê-lo ou fazê-lo dentro de uma função).