Desea evitar que sea un parámetro, por lo tanto, intentamos anteponerle algo. Se puede acceder al directorio actual con .
, por lo tanto, se puede acceder a la subcarpeta -
alternativamente con ./-
.
cd ./-
La razón por la que cd -- -
no funciona es porque esto se implementa de manera diferente si compara rm
(ver man rm
) con cd
(ver man bash
o man cd
), cd
tiene una interpretación diferente que se ve -
como un parámetro (ver man bash
o man cd
).
También debe tenerse en cuenta que cd
es una función integrada de shell, como se puede leer en esta respuesta :
cd
no es un comando externo, es una función interna de shell. Se ejecuta en el contexto del shell actual, y no, como lo hacen los comandos externos, en un contexto fork / exec'd como un proceso separado.
Hay un cd
comando externo , pero hace algo completamente diferente .
Esto explica por qué la implementación es diferente, ya que Bash y Coreutils son dos cosas diferentes.
Supongamos que no crees esto, ¿cómo confirmamos eso? Uso which
y 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
Consulte man which
para obtener más información, man bash
o man type
paratype
cd
sea un incorporado. La razón por lacd -- -
que no funciona es que-
es un operando, no una opción.cd -- -
lo cambiará a un directorio nombrado-
en el directorio actual. FWIWUn signo menos (también conocido como guión) por sí solo no es una opción, sino un operando (es decir, un argumento que no es una opción). Debido a esto, anteponerlo
--
no tiene ningún efecto. El guión es un operandocd -
y sigue siendo un operandocd -- -
. Al igual que otras utilidades estándar,cd
trata un operando como un operando, independientemente de si existe--
antes.El
cd
comando asigna un significado especial al operando-
. Cualquier otra cosa es un directorio para cambiar.cd -- -a
cambia al directorio llamado-a
, porque-a
no es especial como un operando y--
evita que locd
trate como una opción. Esto no funciona-
solo, lo cual no es una opción.Poner comillas
-
no va a ayudar, ya que eso eventualmente pasaría el operando de-
todos modos.Por lo tanto, su único recurso es encontrar otra forma de expresar la misma idea, es decir, otro nombre para el mismo directorio. Afortunadamente, hay una fácil: si agrega
./
antes de un nombre de archivo relativo, todavía significa el mismo archivo. El./
hace una diferencia que es irrelevante en nuestro caso:CDPATH
no se consulta cuando el nombre del directorio comienza con/
,./
o../
. Así:Otra forma, dado que
-
es un directorio, es agregar un/
después. Agregar un/
al final de un nombre de archivo asegura que el archivo se trate como un directorio (en particular, el comando operará en el directorio en sí y no en el enlace simbólico si el archivo es un enlace simbólico a un directorio), pero de lo contrario ninguna diferencia. Así:La escritura
-/
es sugerida por el código de finalización, por cierto, pero en bash solo funciona--
antes, bash no tiene un caso especial paracd -/
(zsh sí).fuente
cd -- -/
, pero debido a que ejecuté el equivalente decd -
justo antes de eso, el directorio en realidad no existía y lo interpreté como otro intento fallido.Calificar con ruta es una opción.
fuente
Estos también funcionarían:
o
fuente