Solo arreglándolo
Este comando muestra un mensaje de error "ERROR: extract: la ruta debe ser absoluta":
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
El error no es útil: el programa ya estaba demasiado confundido.
Ya sabes que el error proviene de ~
, ya que funciona con él $HOME
.
El problema: ~
solo se reemplaza al comienzo de una palabra.
Por ejemplo, esto funciona con la tilde:
echo -extract ~/Downloads
Si necesita la sintaxis de la opción con =
, usar $ HOME en lugar de ~
es la solución más limpia;
echo -extract=$HOME/Downloads
La práctica
Lo que deberías saber:
Hay casos especiales donde ~
get's se expande cuando no está al principio de una palabra: como parte de una asignación variable, directamente después de =
. Lo cual es confuso aquí, por supuesto.
El otro caso especial importante es su uso con variables como PATH. En asignaciones variables, ~
también se expande después :
, como después de la primera =
.
$ dir=~ sh -c 'echo D2: $dir'
D2: /home/user
$ sh -c 'echo D2: $dir' dir=~
D2:
$ echo Dir: $dir
Dir:
$ dir=~; sh -c 'echo D2: $dir'
D2:
$ echo Dir: $dir
Dir: /home/user
$ sh -c 'echo D2: $dir'; d3=~
D2:
$ echo d3: $d3
d3: /home/user
El significado de la tilde
En una concha, ~
la tilde, no es realmente un camino. Solo se reemplaza por un camino $HOME
, algunas veces.
Es algo así como una abreviatura, o abreviatura, proporcionada por el shell.
No se puede usar como una ruta en general, el shell "lo expande" a una ruta solo en lugares muy especiales.
E incluso si se expande, puede ser algo más que el directorio de inicio.
- Solo se expande al comienzo de una palabra , o en una asignación variable después de un
:
o=
- Solo se expande si no está entre comillas
- Solo se expande a
$HOME
si no hay más caracteres en la palabra antes de un/
El problema en la linea de comando
De acuerdo con esto, el problema en su comando es que la tilde en
-extract=~/Downloads/nvidia_installers
no se expande porque no es uno de los casos enumerados. Eso es todo.
La solución podría ser hacer que la tilde sea el primer carácter sin comillas de una palabra, sin otro carácter antes de la siguiente /
; eso es justo lo que obtienes cuando usas una opción con un espacio antes del argumento de la opción:
-extract ~/Downloads/nvidia_installers
Otra solución sería usar $HOME
en su lugar. En un guión, esa suele ser la mejor opción.
-extract=$HOME/Downloads/nvidia_installers
El mensaje de error
Pero, ¿cómo aparece el mensaje de error
"ERROR: extract: path must be absolute."
?
encajar en todo esto?
Sabemos que la tilde no se expandió. Eso significa que el programa obtuvo el texto del argumento incluyendo el ~
, pero sin el /home/auser
como la ruta. Ese camino es ~/Downloads/nvidia_installers
, pero ahora no hay caparazón, por lo que la tilde no tiene un significado especial. Es solo un nombre de directorio normal. Y como cualquier otra ruta de la forma foo/bar/baz
, es una ruta relativa
Otros usos
Si hay caracteres después de ~
, como en ~alice
- con todas las demás reglas anteriores aplicadas - y hay un nombre de usuario alice
, que se expande al directorio de inicio de alice
, digamos home/alice
.
Además, si es así bob
, ~
se expandiría a /home/bob
, y ~bob
se expandiría a la misma.
La variante ~+
se expande al directorio actual,$PWD
Para referirse al directorio anterior, donde estaba antes del último cd
, puede usar ~-
, que se expande a $OLDPWD
.
Si usa pushd
y popd
, en lugar de cd
, ya sabrá que se puede acceder a la pila de directorios como ~-2
.
Detalles
Todos los casos donde ~
se expande a una ruta son manejados por el shell . Para otros programas, ~
es solo un carácter de nombre de archivo normal.
Para la definición exacta dentro del shell, aquí está la sección relevante de
Note cómo reemplazar por es solo un caso especial de muchos casos: "Si este nombre de inicio de sesión es la cadena nula, la tilde se reemplaza con el valor del parámetro del shell HOME. " :man bash
~
$HOME
Tilde Expansion
If a word begins with an unquoted tilde character (`~'), all of the charac‐
ters preceding the first unquoted slash (or all characters, if there is no
unquoted slash) are considered a tilde-prefix. If none of the characters
in the tilde-prefix are quoted, the characters in the tilde-prefix follow‐
ing the tilde are treated as a possible login name. If this login name is
the null string, the tilde is replaced with the value of the shell parame‐
ter HOME. If HOME is unset, the home directory of the user executing the
shell is substituted instead. Otherwise, the tilde-prefix is replaced with
the home directory associated with the specified login name.
If the tilde-prefix is a `~+', the value of the shell variable PWD replaces
the tilde-prefix. If the tilde-prefix is a `~-', the value of the shell
variable OLDPWD, if it is set, is substituted. If the characters following
the tilde in the tilde-prefix consist of a number N, optionally prefixed by
a `+' or a `-', the tilde-prefix is replaced with the corresponding element
from the directory stack, as it would be displayed by the dirs builtin
invoked with the tilde-prefix as an argument. If the characters following
the tilde in the tilde-prefix consist of a number without a leading `+' or
`-', `+' is assumed.
If the login name is invalid, or the tilde expansion fails, the word is
unchanged.
Each variable assignment is checked for unquoted tilde-prefixes immediately
following a : or the first =. In these cases, tilde expansion is also per‐
formed. Consequently, one may use filenames with tildes in assignments to
PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.