Cygwin perde cólon de letra de unidade de caminhos de estilo do Windows em variáveis

2

Eu me deparei com um problema estranho ao tentar obter um script de compilação (de terceiros) para trabalhar na minha configuração com o Win7 e Cygwin (versão mais recente). O problema pode ser melhor descrito com um exemplo% snippet de script bash :

foo="/cygdrive/c/svn/Projects/Client Config/Android/Repack/foo/out"
cygpath -w "$foo/play-services-tasks/classes.jar"
bar='cygpath -w "$foo/play-services-tasks/classes.jar"'
echo $bar

Em execução, o resultado é o seguinte (preste atenção nos dois pontos após a letra da unidade):

C:\svn\Projects\Client Config\Android\Repack\foo\out\play-services-tasks\classes.jar
C \svn\Projects\Client Config\Android\Repack\foo\out\play-services-tasks\classes.jar

Assim, o caminho (a saída de cygpath ) é adequado antes de colocá-lo em uma variável, mas a variável não contém mais os dois pontos após a letra da unidade. Isso, por sua vez, faz com que outro script / ferramenta falhe quando tenta iterar caminhos separados por espaços em uma variável. E infelizmente, essa ferramenta espera ter os caminhos de estilo do Windows.

Escusado será dizer que estou perplexo ...

A questão apareceu quando o script de construção mudou e pode não ter alguns hacks de compatibilidade com o cygwin, alguns dos quais eu já consegui aplicar, mas este é realmente desagradável. Pode ser possível contornar as partes alteradas de alguma forma, mas prefiro descobrir qual é o motivo da minha descoberta e como lidar com isso diretamente.

    
por zagrimsan 26.01.2017 / 12:51

1 resposta

1

O problema apareceu quando o script de construção mudou e faltavam alguns hacks de compatibilidade com cygwin, alguns dos quais eu já tinha conseguido aplicar antes de chegar a este.

Eu finalmente consegui descobrir o verdadeiro culpado, que era que havia uma função no script de construção que (enquanto iterava sobre a variável PATH ) definia a variável de ambiente IFS=: e não a redefiniu posteriormente. Como bash usa essa variável para dividir strings em campos, e faz expansão de variável também ao usar variáveis não citadas. Assim, a correção foi fazer SAVEIFS="$IFS" antes de redefinir IFS e depois defini-lo novamente por IFS=$SAVEIFS . Alternativamente, como Gordon Davisson gentilmente explicou, eu poderia ter assegurado que as variáveis fossem usadas sempre com aspas duplas (por exemplo, echo "$bar" em vez de echo $bar ).

Problema resolvido, não realmente relacionado ao Cygwin de qualquer outra forma que não seja o uso de dois pontos para diferentes propósitos no Windows e no Cygwin e, assim, algumas vezes, é necessário tocar na variável do separador de campo interno. Por essa única razão eu pensei que deveria deixar isso aqui, no caso de alguém se deparar com um problema semelhante. Há também muitas coisas boas sobre todos os aspectos da expansão do shell em USE.

    
por 26.01.2017 / 14:51