Como você insere um diretório cujo nome é apenas um menos?

25

Eu baixei lessn para o meu servidor e o descompactei.

Ele contém uma pasta chamada - . Presumi que sei como lidar com isso, mas não sei.

Eu tentei cd -- - , mas isso não tem o efeito desejado. Usar citações também não parece afetá-lo. Eu coloquei barras em todo o lugar, sem sucesso.

Qual é a maneira correta de mudar para esta pasta?

    
por Der Hochstapler 27.10.2012 / 01:20

4 respostas

33

Você quer evitar que seja um parâmetro, por isso, tentamos adicionar algo a ele. O diretório atual pode ser acessado com . , assim a subpasta - pode ser acessada alternativamente com ./- .

cd ./-

O motivo pelo qual cd -- - não funciona é porque isso é implementado de forma diferente se você comparar rm (consulte man rm ) para cd (consulte man bash ou man cd ), cd tem uma interpretação diferente que vê - como parâmetro (veja man bash ou man cd ).

Deve-se notar também que cd é uma função embutida no shell, como pode ser lido em esta resposta :

cd is not an external command - it is a shell builtin function. It runs in the context of the current shell, and not, as external commands do, in a fork/exec'd context as a separate process.

Existe um comando cd externo, mas faz algo totalmente diferente .

Isso explica por que a implementação é diferente, como Bash e Corutils são duas coisas diferentes.

Vamos apenas supor que você não acreditaria nisso, como podemos confirmar isso? Use which e type .

 $ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
 $ which rm && type rm
/bin/rm
/bin/rm is /bin/rm

Veja man which para mais informações, e man bash ou man type para type

    
por 27.10.2012 / 01:25
21

Um sinal de menos (a.k.a.) sozinho não é uma opção, mas um operando (ou seja, um argumento que não é uma opção). Por causa disso, colocar -- antes de não ter efeito. O traço é um operando em cd - e ainda um operando em cd -- - . Como outros utilitários padrão, cd trata um operando como um operando, independentemente de haver -- antes.

O comando cd atribui um significado especial ao operando - . Qualquer outra coisa é um diretório para mudar para. cd -- -a muda para o diretório chamado -a , porque -a não é especial como um operando e o -- impede cd de tratá-lo como uma opção. Isso não funciona para - sozinho, o que não é uma opção.

Colocar aspas em torno de - não ajudará, pois isso acabaria passando o operando - de qualquer maneira.

Seu único recurso é, portanto, encontrar outra maneira de expressar a mesma ideia, ou seja, outro nome para o mesmo diretório. Felizmente, há uma fácil: se você adicionar ./ antes de um nome de arquivo relativo, ele ainda significa o mesmo arquivo. O ./ faz uma diferença que é irrelevante no nosso caso: CDPATH não é consultado quando o nome do diretório começa com / , ./ ou ../ . Assim:

cd ./-

Outra maneira, como - é um diretório, é adicionar um / após ele. Adicionar um / no final de um nome de arquivo garante que o arquivo seja tratado como um diretório (em particular, o comando operará no próprio diretório e não no link simbólico se o arquivo for um link simbólico para um diretório), mas de outra forma não faz diferença. Assim:

cd -- -/

A propósito, escrever -/ é sugerido pelo código de conclusão, mas no bash ele só funciona com -- antes, bash não tem um caso especial para cd -/ (zsh does). / p>     

por 27.10.2012 / 01:56
5

A qualificação com o caminho é uma opção.

cd ./-
    
por 27.10.2012 / 01:25
1

Isso também funcionaria:

cd ~/'-'

ou

cd ~/"-"
    
por 03.06.2015 / 13:54