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 basho man cd), cdtiene una interpretación diferente que se ve -como un parámetro (ver man basho man cd).
También debe tenerse en cuenta que cdes una función integrada de shell, como se puede leer en esta respuesta :
cdno 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 cdcomando 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 whichy 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 whichpara obtener más información, man basho man typeparatype
cdsea 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,cdtrata un operando como un operando, independientemente de si existe--antes.El
cdcomando asigna un significado especial al operando-. Cualquier otra cosa es un directorio para cambiar.cd -- -acambia al directorio llamado-a, porque-ano es especial como un operando y--evita que locdtrate 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:CDPATHno 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