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 cduna ruta de directorio con un espacio en uno de los nombres de directorio, por lo que necesito las comillas (es Windows Program Filesen vino). Puedo evitarlo con dos cdcomandos, 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

cden un directorio llamado~?cdcompleto. 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
cden 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
$HOMElugar 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 lobashinterpreta: 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
bashcaracterí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 ycdfalla 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~johnse 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 delbashsugiere que trabaja muy bien.)Explore usando el
echocomandoLa forma más fácil de explorar cómo funcionan las cosas en bash es con el
echocomando. 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