Diretório de correspondência parcial curinga Bash

3

Eu tenho este script bash que está tentando encontrar um diretório que muda parcialmente nos sistemas das pessoas.

cd "$HOMEDIR/AppData/Local/GitHub/PortableGit"*"/bin"

No entanto, isso não parece funcionar - é só pegar a string literal.

Existe uma maneira fácil de expandir corretamente?

Editar:

Ok, isso é estranho, funciona um pouco.

Quando faço isso:

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin
eval GIT_DIR_PASS=$GIT_DIR
echo $GIT_DIR_PASS

Eu obtenho a informação correta

mas quando eu tento atribuir $ GIT_DIR_PASS para outra variável eu recebo a versão literal da string.

    
por Ley Missailidis 20.02.2013 / 19:41

2 respostas

7

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin

Acima do caractere curinga não é expandido, porque você está atribuindo a uma variável escalar que pode conter apenas uma cadeia de caracteres, por isso nenhuma divisão de palavras ou geração de nome de arquivo ocorre.

eval GIT_DIR_PASS=$GIT_DIR

Aqui, é um argumento para um comando simples, portanto os curingas são expandidos, mas seriam expandidos para arquivos cujo caminho é "GIT_DIR_PATH=..." .

echo $GIT_DIR_PASS

Aqui, os curingas são expandidos. Você não está imprimindo o conteúdo da variável, mas a lista de argumentos que resultam da expansão desde a variável não é citada.

Você deseja:

set -- "$HOMEDIR"/AppData/Local/GitHub/PortableGit*/bin

Isso expande esse padrão para a lista de arquivos correspondentes e os atribui a $1 , $2 ...

GIT_DIR=$1

Escolha o primeiro.

    
por 20.02.2013 / 21:39
0

Dê uma olhada em estes exemplos para ter uma ideia de como usar curingas em bash . Além disso, esqueça o material eval .

Um glob que corresponderia a todos os diretórios denominados /bin/ que são subdiretórios diretos de qualquer subdiretório direto de .../PortableGit/ :

HOMEDIR=/home/$USER
ls "$HOMEDIR/AppData/Local/GitHub/PortableGit/"*"/bin"

Eu acho que cd é seu problema. O que exatamente você espera que faça? Se houver mais de um diretório correspondente à sua expressão, seria inútil chamá-lo dessa maneira, porque cd terminará no primeiro diretório correspondente, independentemente do que você esteja planejando fazer lá. Se você quiser inserir os diretórios em sequência, faça coisas neles, então, executar um loop sobre uma saída find em conformidade pareceria mais apropriado.

Existe uma questão semelhante em stackoverflow .

    
por 20.02.2013 / 21:39