¿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?

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


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í).


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


2

Estos también funcionarían:

cd ~/'-'

o

cd ~/"-"

1
pero solo si ocurre en el directorio de inicio
— RiaD

1
... y las citas son innecesarias.
— Scott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.