Por que a expansão do nome do caminho funciona assim?

0

Eu tenho uma estrutura de diretórios como esta:

.
├── dir
│   └── src
│       └── file.c
├── dir_a1
│   └── src
│       └── file.c
└── dir_a2
    └── src
        └── file.c

Quando executo o seguinte comando, os resultados são os esperados:

echo dir{,_a[12]}/**/*.c 
#
dir/src/file.c
dir_a1/src/file.c
dir_a2/src/file.c

Se eu remover file.c de dir_a2 , os resultados ainda estarão OK:

rm dir_a2/src/file.c
echo dir{,_a[12]}/**/*.c
#
dir/src/file.c
dir_a1/src/file.c

Mas quando eu removo file.c do dir , os resultados desse diretório ficam confusos:

rm dir/src/file.c
echo dir{,_a[12]}/**/*.c
#
dir/**/*.c
dir_a1/src/file.c

Por que o bash decidiu remover o resultado da expansão de dir_a2 , mas não de dir ?

globstar está ativado no shell.

    
por xba 24.09.2016 / 22:12

1 resposta

1

A expansão de chave (isto é, {this,that,etc} ) não é um arquivo glob, o que significa que ele se expande para todos os valores, haja ou não um arquivo com esse nome. Assim, dir{,_a[12]}/**/*.c expande para os dois padrões de glob dir/**/*.c e dir_a[12]/**/*.c . O segundo expande para o único arquivo correspondente, dir_a1/src/file.c , mas o primeiro não corresponde a nada e, portanto, é deixado sozinho (e, portanto, é reproduzido literalmente).

Se você não quiser passar globs sem correspondência, defina a opção nullglob shell, via shopt -s nullglob . Mas esteja ciente de que isso fará com que outras coisas ajam de maneiras estranhas, como ls /etc/*.nosuchextension listando o conteúdo do diretório atual. Outra maneira de lidar com globs incomparáveis é a opção failglob shell.

    
por 24.09.2016 / 23:15

Tags