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

26

Eu baixei lessn para o meu servidor web e descompactei.

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

Eu tentei cd -- -, mas isso não tem o efeito desejado. O uso de aspas também não parece afetá-lo. Coloquei barras em todo o lugar, sem sucesso.

Qual é a maneira correta de mudar para esta pasta?

Der Hochstapler
fonte

Respostas:

34

Você deseja evitar que seja um parâmetro, portanto tentamos acrescentar algo a ele. O diretório atual pode ser acessado com ., portanto, a subpasta -pode ser acessada alternativamente com ./-.

cd ./-

A razão para isso cd -- -não funcionar é porque isso é implementado de maneira diferente se você comparar rm(ver man rm) com cd(ver man bashou man cd), cdtem uma interpretação diferente que vê -como parâmetro (ver man bashou man cd).

Também deve ser observado que cdé uma função interna do shell, como pode ser lido nesta resposta :

cdnão é um comando externo - é uma função interna do shell. Ele é executado no contexto do shell atual e não, como comandos externos, em um contexto fork / exec'd como um processo separado.

Existe um cdcomando externo , mas faz algo totalmente diferente .

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

Vamos supor que você não acreditaria nisso, como confirmamos isso? Use whiche 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 whichpara mais informações e man bashou man typeparatype

Tamara Wijsman
fonte
4
Não, "-" é implementado em todos os utilitários padrão, mas deve finalizar as opções. "-" por si só não é reconhecido como uma opção, mas como o diretório anterior.
Stéphane Chazelas 26/10/12
4
Solução correta, mas a explicação está errada. É completamente irrelevante que cdé um builtin. O motivo cd -- -não funciona é que -é um operando, não uma opção.
Gilles 'SO- stop be evil'
11
no Mac OS X cd -- -, você será alterado para um diretório nomeado -no diretório atual. FWIW.
Tim Tim
A maioria dos comentários foi refletida na segunda parte do meu post.
Tamara Wijsman
22

Um sinal de menos (aka traço) sozinho não é uma opção, mas um operando (isto é, um argumento que não é uma opção). Por isso, colocar --antes não tem efeito. O traço é um operando cd -e ainda um operando cd -- -. Como outros utilitários padrão, cdtrata um operando como um operando, independentemente de existir --antes dele.

O cdcomando atribui um significado especial ao operando -. Qualquer outra coisa é um diretório para o qual mudar. cd -- -amuda para o diretório chamado -a, porque -anão é especial como um operando e --evita cdtratá-lo como uma opção. Isso não funciona -sozinho, o que não é uma opção.

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

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

cd ./-

Outra maneira, como -é um diretório, é adicionar um /depois dele. A adição de um /no final de um nome de arquivo garante que o arquivo seja tratado como um diretório (em particular, o comando funcionará 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, caso contrário, fará com que sem diferença Portanto:

cd -- -/

A escrita -/é sugerida pelo código de conclusão, a propósito, mas no bash, na verdade, só funciona --antes, o bash não tem um caso especial para cd -/(o zsh faz).

Gilles 'SO- parar de ser mau'
fonte
Isso me impressiona, na verdade tentei cd -- -/, mas, por ter executado o equivalente a pouco cd -antes disso, o diretório realmente não existia e eu o interpretei como outra tentativa fracassada.
Der Hochstapler
5

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

cd ./-
iruvar
fonte
2

Isso também funcionaria:

cd ~/'-'

ou

cd ~/"-"
Michael Durrant
fonte
11
mas somente se isso acontecer no diretório pessoal
RiaD 29/03
11
… E as aspas são desnecessárias.
Scott