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 bash
ou man cd
), cd
tem uma interpretação diferente que vê -
como parâmetro (ver man bash
ou man cd
).
Também deve ser observado que cd
é uma função interna do shell, como pode ser lido nesta resposta :
cd
nã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 cd
comando 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 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
paratype
cd
é um builtin. O motivocd -- -
não funciona é que-
é um operando, não uma opção.cd -- -
, você será alterado para um diretório nomeado-
no diretório atual. FWIW.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 operandocd -
e ainda um operandocd -- -
. Como outros utilitários padrão,cd
trata um operando como um operando, independentemente de existir--
antes dele.O
cd
comando atribui um significado especial ao operando-
. Qualquer outra coisa é um diretório para o qual mudar.cd -- -a
muda para o diretório chamado-a
, porque-a
não é especial como um operando e--
evitacd
tratá-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:CDPATH
não é consultada quando o nome do diretório começa com/
,./
ou../
. Portanto: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: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 paracd -/
(o zsh faz).fonte
cd -- -/
, mas, por ter executado o equivalente a poucocd -
antes disso, o diretório realmente não existia e eu o interpretei como outra tentativa fracassada.A qualificação com o caminho é uma opção.
fonte
Isso também funcionaria:
ou
fonte