¿Cómo se ingresa a un directorio cuyo nombre es solo un signo menos?

26

Descargué lessn en mi servidor web y lo descomprimí.

Contiene una carpeta llamada -. Supuse que sabía cómo lidiar con eso, pero no lo sé.

Lo intenté cd -- -, pero eso no tiene el efecto deseado. Usar comillas tampoco parece afectarlo. Puse barras por todo el lugar, sin resultado.

¿Cuál es la forma correcta de cambiar a esta carpeta?

Der Hochstapler
fuente

Respuestas:

34

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

Tamara Wijsman
fuente
44
No, "-" se implementa en todas las utilidades estándar, pero está destinado a finalizar las opciones. "-" solo no se reconoce como una opción sino como el directorio anterior.
Stéphane Chazelas
44
Solución correcta, pero la explicación es incorrecta. Es completamente irrelevante que cdsea ​​un incorporado. La razón por la cd -- -que no funciona es que -es un operando, no una opción.
Gilles 'SO- deja de ser malvado'
1
en Mac OS X cd -- -lo cambiará a un directorio nombrado -en el directorio actual. FWIW
Tim Kennedy
La mayoría de los comentarios se reflejaron en la segunda parte de mi publicación.
Tamara Wijsman
22

Un 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 operando cd -y sigue siendo un operando cd -- -. 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 lo cdtrate 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í:

cd ./-

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í:

cd -- -/

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 para cd -/(zsh sí).

Gilles 'SO- deja de ser malvado'
fuente
Realmente lo intenté cd -- -/, pero debido a que ejecuté el equivalente de cd -justo antes de eso, el directorio en realidad no existía y lo interpreté como otro intento fallido.
Der Hochstapler
5

Calificar con ruta es una opción.

cd ./-
iruvar
fuente
2

Estos también funcionarían:

cd ~/'-'

o

cd ~/"-"
Michael Durrant
fuente
1
pero solo si ocurre en el directorio de inicio
RiaD
1
... y las citas son innecesarias.
Scott