Como escapar de um nome de subdiretório com um e comercial?

9

Executando um kornshell e tentando atravessar uma árvore de diretórios. Deseja cd para um subdiretório chamado da seguinte maneira:

 -3ab_&_-3dc.img

Minha pergunta é: como preciso escapar do e comercial nesse nome? Tentei diferentes combinações de aspas duplas e barras invertidas sem êxito.

RCinICT
fonte

Respostas:

11

Para o &(ou quase qualquer outro personagem, você tem duas possibilidades simples.

  • Coloque aspas simples em torno da coisa toda: ' -3ab_&_-3dc.img'
  • Coloque uma barra invertida antes de cada caractere problemático: -3ab_\&_-3dc.img

Existem duas exceções:

  • O método de aspas simples não funciona para uma aspas simples. A barra invertida não é especial entre aspas simples, então você também não pode usá-lo diretamente. O que você pode fazer é encerrar a sequência de aspas simples, usar imediatamente barra invertida mais aspas simples e reiniciar a aspas simples. Assim, por exemplo, se o nome do diretório é foo'bar\qux: cd 'foo'\''bar\qux'. Você pode se lembrar dessa maneira: dentro de aspas simples, '\''você recebe uma aspas simples.
  • O método de barra invertida não funciona para novas linhas: barra invertida-nova linha é apenas ignorada. Você precisa colocar aspas simples em torno de uma nova linha.

Você também pode usar aspas duplas, mas precisará colocar uma barra invertida antes de alguns caracteres. Aspas simples são mais diretas.

Há uma dificuldade adicional aqui, que é que o nome do diretório comece com um traço. Esse personagem diz ao cdcomando (como quase todos os comandos) que uma opção segue. O traço não é especial para o shell, apenas para o comando, portanto, as aspas não o afetam. Você tem duas maneiras de passar um argumento que começa com um traço para um comando sem que ele seja interpretado como uma opção:

  • Encontre outra maneira de expressar esse argumento. Para um nome de arquivo, adicionar ./na frente ainda designa o mesmo arquivo.
  • Coloque o argumento --antes. Isso diz ao comando para parar de procurar opções.

Então, aqui estão algumas maneiras de mudar para esse subdiretório:

cd -- '-3ab_&_-3dc.img'
cd -- -3ab_\&_-3dc.img
cd ./-3ab_\&_-3dc.img
cd './-3ab_&_-3dc.img'
Gilles 'SO- parar de ser mau'
fonte
Obrigado. Pensei que havia tentado esse formato também, mas esqueci de escapar do e comercial (como no seu terceiro exemplo). Quando eu fiz, funcionou.
RCinICT 26/03/2013
5

O e comercial precisa ser escapado, mas o problema que você está tendo provavelmente é com o líder -, e não com o e comercial. O líder -fez pensar que você está passando opções. Você pode contornar isso usando ./:

cd './-3ab_&_-3dc.img'
jordanm
fonte
A &é definitivamente um problema. Quanto ao -, isso depende da casca. O Zsh está muito feliz cdcom um diretório que começa com a -. No entanto bash não é.
25413 Patrick
Obrigado. Pensei que tivesse tentado esse formato também, mas esqueci de escapar do e comercial. Quando eu fiz, funcionou.
RCinICT 26/03