2011-12-07 13 views
33

He escrito este guión:"~/Desktop/test.txt: No existe el fichero o directorio"

#!/bin/bash 

file="~/Desktop/test.txt" 
echo "TESTING" > $file 

El guión no funciona; me da este error:

./tester.sh: line 4: ~/Desktop/test.txt: No such file or directory 

¿Qué estoy haciendo mal?

+0

Cambié el título para hacerlo más descriptivo. –

+0

Posible duplicado de [la expansión de Tilde no funciona en Bash] (https://stackoverflow.com/questions/5748216/tilde-expansion-not-working-in-bash) – codeforester

Respuesta

53

Intente reemplazar ~ con $HOME. La expansión de Tilde solo ocurre cuando la tilde no está citada. Ver info "(bash) Tilde Expansion".

También puede hacer file=~/Desktop sin citarlo, pero si alguna vez reemplaza parte de esto con algo con un separador de campo, se romperá. Citar los valores de las variables es probablemente una buena cosa para acostumbrarse de todos modos. Citar la variable file=~/"Desktop" también funcionará, pero creo que es bastante feo.

Otra razón para preferir $HOME, cuando sea posible: la expansión de tilde solo ocurre al comienzo de las palabras. Por lo tanto, command --option=~/foo solo funcionará si command realiza la expansión de tilde, que variará según el comando, mientras que command --option="$HOME/foo" siempre funcionará.

+0

¡Guau, eso funcionó! ¿Cómo es que eso funciona y mi guión no? – Mason

+1

Respuesta actualizada. –

+4

@Mason: también, la expansión de tilde ocurre antes de la expansión de la variable, por lo que cuando '$ file' se convierte a' ~/Desktop/test.txt' ya se ha perdido la fase de expansión de tilde. Consulte http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions para el orden de expansión. –

1

FYI, también se puede utilizar eval:

eval "echo "TESTING" > $file" 

El eval toma el mando como un argumento y que hace que el shell para hacer el Tilde expansion.

Cuestiones relacionadas