Escribo mi primer guión, así que estoy seguro de que esta es una pregunta básica, pero ¿alguien puede explicarme por qué puedo:
cd ~
cd bin
cd ~/bin
cd 'bin'
Pero no
cd '~'
cd '~/bin'
Necesito cd
una ruta de directorio con un espacio en uno de los nombres de directorio, por lo que necesito las comillas (es Windows Program Files
en vino). Puedo evitarlo con dos cd
comandos, pero ¿por qué no puedo poner ~
comillas?
Si escribo cd '~'
(o cd "~"
) obtengo:
bash: cd: ~: No such file or directory
command-line
bash
B. Tanner
fuente
fuente
cd
en un directorio llamado~
?cd
completo. Use variables para almacenar nombres de ruta que no desea escribir varias veces, por ejemplopf=~/.wine/drive_c/Program\ Files/; cp /path/to/file "$pf"
/
oNUL
?cd ./~
Respuestas:
Como @karel señaló en su respuesta,
~
es un personaje especial y Bash lo expandió al directorio de inicio del usuario actual. Consulte el manual de Bash sobre "Expansión de Tilde" , o busque el título "Expansión de Tilde" en la página de manual (man bash
).Cualquier tipo de cita alrededor del
~
evita esta expansión de tilde.Para responder a su pregunta sobre cómo aún puede usarlo
cd
en un directorio con espacios en su nombre, hay algunas alternativas:Omite comillas y escapa de los espacios con barras invertidas en su lugar:
Cite el resto del camino, pero omítalos alrededor de la tilde y la primera barra:
Como puede ver, puede concatenar cadenas entre comillas y sin comillas en Bash simplemente escribiéndolas una al lado de la otra sin espacios en el medio.
Utilice la variable de entorno en
$HOME
lugar de la tilde, que aún se expande dentro de "comillas dobles" (pero no 'comillas simples'):fuente
~'/...'
no funcionará y no es lo que tiene esta respuesta.~/'...'
o~/"..."
funcionará.~/'path'
Es el camino a seguir.~'/...'
funcionaría? La barra diagonal no es un carácter especial, por lo que parece que debería funcionar dentro o fuera de las comillas.~ es un carácter especial que el shell interpreta como el directorio de inicio del usuario conectado. '~' es interpretado por el shell como un carácter literal ~, no como el directorio de inicio del usuario conectado porque al encerrar una cadena dentro de dos caracteres de comillas simples se interpreta esa cadena como una cadena de texto literal.
fuente
~
no es un alias en el sentido en que lobash
interpreta: los alias permiten que una cadena sea sustituida por una palabra cuando se usa como la primera palabra de un comando simple. . Como explico en mi respuesta a continuación, es más bien una expansión.Esta es una
bash
característica llamada Tilde Expansion . Citandoman bash
:Para que la expansión funcione, el carácter tilde
~
debe estar sin comillas, de lo contrario, el carácter se toma literalmente ycd
falla si no hay un directorio nombrado~
presente en el directorio actual. Vea esta respuesta entretenida para obtener una explicación de la citabash
. Si necesita citar parte de la ruta, puede:cite al menos los caracteres que necesitan comillas con comillas simples, p. ej.
o
cite al menos los caracteres que necesitan comillas con comillas dobles, p. ej.
o
cite solo los caracteres que necesitan comillas con barras invertidas, p. ej.
Tilde Expansion tiene algunas características más interesantes, por ejemplo:
~+
se expande al valor dePWD
, es decir, el directorio de trabajo actual~-
se expande al valor deOLDPWD
, es decir, el directorio de trabajo anterior~john
se expande al directorio de inicio asociado con el nombre de inicio de sesión "john"fuente
$ touch a; cd \a
. (Pensé que esto podría tener problemas con elcd \n
, pero la experimentación, al menos en mi versión delbash
sugiere que trabaja muy bien.)Explore usando el
echo
comandoLa forma más fácil de explorar cómo funcionan las cosas en bash es con el
echo
comando. En el caso de~
usar esto:Como puede ver, cuando una comilla simple o una comilla doble
~
se interpreta literalmente como una cadena y no se expande como una variable. Cuando usa backticks (`) se ejecuta como un comando y genera un mensaje de error.fuente