Bash Brace Expansion & Variables [duplicado]

2
    

Esta pergunta já tem uma resposta aqui:

    

Eu tenho um comando de busca:

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

Desejo substituir Alpha,Bravo,Charlie por $find_dir

find Directory/{$find_dir} arg1 arg2

no entanto, o segundo se expande para

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

em vez disso

find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2

Por quê? É parte de um script bash razoavelmente complexo que pode ter mais ou menos diretórios, não todos os que são relevantes (então o upload / * de globbing não funcionaria). Então, se eu configurar três agora e adicionar outro, terei que adicioná-lo manualmente mais tarde. Além disso, preciso executá-lo a partir da raiz dos diretórios para manter a perspectiva das saídas de resultados (./Upload/Dir/file, em oposição a ./Dir/file).

Mas o uso de uma variável me permitiria alterar isso conforme necessário e mantê-la relevante para outras partes do script.

    
por Miati 29.10.2014 / 02:51

1 resposta

4

Da documentação de bash , seção Expansão de contraventamento :

Brace expansion is performed before any other expansions, and any characters special to other expansions are preserved in the result. It is strictly textual. Bash does not apply any syntactic interpretation to the context of the expansion or the text between the braces. To avoid conflicts with parameter expansion, the string ‘${’ is not considered eligible for brace expansion.

Outra nota, em bash :

The order of expansions is: brace expansion, tilde expansion, parameter, variable, and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and filename expansion.

Portanto, no seu caso, bash viu expansão de contraventamento antes da expansão da variável, ele fará a expansão de contraventamento primeiro, produzirá o resultado {Alpha,Bravo,Charlie} .

Se você pode controlar o conteúdo da variável $find_dir , você pode usar eval :

eval "find Directory/{$find_dir} arg1 arg2"
    
por 29.10.2014 / 03:14