ls (1) age estranhamente quando a entrada é uma variável / subcomando ou apenas digitado

2

D

Estou enfrentando um problema em ls (1) que tenho quase certeza de que é uma coisa boba que estou deixando passar. De qualquer forma, não consigo entender realmente por que isso não está funcionando.

Estou usando bash para cygwin (não pergunte por que ... eu só tenho que :() Aqui está a saída de versão completa (significativa): GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)

Eu estava brincando com cygpath para converter os caminhos unix / windows para mim, para que eu possa ficar a maior parte do tempo no terminal e ainda assim conseguir os caminhos das janelas e vice-versa.

Até agora, tudo bem ... mas uma coisa chata no NT é que muitos caminhos têm espaços e outros caracteres que não se encaixam bem nos caminhos, como ( ) . Para me ajudar com isso, eu acabei de escrever um script oneliner para escapar de todos os caminhos com barras invertidas, então eu terei um caminho válido, não importa o que as janelas loucas colocam neles.

Até agora, ainda é tão bom ... Mas aí eu me deparei com um problema que o ls (1) fica confuso sobre os caminhos, é meio difícil de explicar então vai colocar alguns exemplos!

## Lets imagine that I want to get the "unix" version of C:\Program Files (x86)
## And for sake of simplicty I'll call the oneliner sript as unix_path.

unix_path "C:\Program Files (x86)"
##  prints /cygdrive/c/Program\ Files\ \(x86\)

my_path=$(unix_path "C:\Program Files (x86)");
echo $my_path;
##  prints /cygdrive/c/Program\ Files\ \(x86\)

## Until now, we're good!
## But the next commands really bugs me...

ls $my_path;
##  ls: cannot access '/cygdrive/c/Program\': No such file or directory
##  ls: cannot access 'Files\': No such file or directory
##  ls: cannot access '\(x86\)': No such file or directory

ls $(unix_path "C:\Program Files (x86)")
##  Same as before...
##  ls: cannot access '/cygdrive/c/Program\': No such file or directory
##  ls: cannot access 'Files\': No such file or directory
##  ls: cannot access '\(x86\)': No such file or directory

ls "$my_path";
##  ls: cannot access '/cygdrive/c/Program\ Files\ \(x86\)': No such file or directory

## Now is very crazy, let's imagine that I type /cygdrive/c/Program\ Files\ \(x86\)
## by hand or just paste it.
ls /cygdrive/c/Program\ Files\ \(x86\)
##   I'll not post but the listing are correct!

Eu realmente não entendo porque o ls (1) não está correto quando eu o chamo com $() ou com o $var_name_here , mas ainda está correto quando eu digito o caminho. Observe que o caminho é idêntico para os dois lados!

Qualquer ajuda aqui seria ótima! Obrigado!

    
por n2omatt 23.07.2017 / 18:37

1 resposta

2

Porque

ls $my_path;

torna-se

ls /cygdrive/c/Program Files (x86)

porque as barras invertidas não são realmente parte do caminho, elas são apenas um truque no bash "liters".

Portanto, ls recebe três nomes de arquivos distintos /cygdrive/c/Program , Files e (x86) . Para que ls veja um único nome de arquivo com espaços dentro, use:

ls "$my_path"

Na prática, no bash, você coloca aspas duplas em torno de todas as strings que podem conter espaços e que você quer ser visto como uma única unidade. $ -subtituição ainda acontece dentro de aspas duplas (mas não acontece dentro de aspas simples)

    
por 24.07.2017 / 02:34