Estoy tratando de extraer la parte diferente del instalador de la biblioteca Nvidia cuda. Estoy usando el siguiente comando:
mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
Y recibo el siguiente mensaje:
ERROR: extract: path must be absolute.
Y cuando escribo el comando con la dirección literal de mi casa, funciona perfectamente.
./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers
Estoy confundido, ¿no debería ~ ser el mismo de / home / likewise-open / XXX / username?
Probado:
./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers
y funciona, pero no sé por qué no permite ~
command-line
paths
Regan
fuente
fuente
Respuestas:
Bash solo expande un ~ si es el comienzo de una palabra. Puede ver esto entre los siguientes comandos:
Bash busca
~
personajes independientes y~/
esta sustitución. Ninguna otra combinación o versión citada funcionará.$HOME
funciona porque las sustituciones variables son más robustas ($
es un carácter especial, mientras que~
es mucho menos):Mientras hablamos
~
, en realidad tiene otros dos usos de sustitución:~+
el directorio de trabajo actual (leer de$PWD
)~-
el directorio de trabajo anterior (leer de$OLDPWD
)Al igual que con plain
~
, estos pueden tener rutas adicionales agregadas al final, y nuevamente, estos deben ser el prefijo de una palabra o Bash los ignorará.Puedes leer más sobre esto en
man bash | less -p ' Tilde'
fuente
zsh
qué (o más bien puede ser configurado para) Expand~
después=
también. Entre otras mejoras convenientes que tiene sobre bash.=
; se trata de expandir al comienzo del lado derecho de una asignación variable. Eso hace que nuestro caso sea un poco más confuso al mirar de cerca: vea mi respuesta. Yzsh
no es diferente debash
esto; La descripción de 'zsh' es un poco críptica:info --subnodes zsh | less +/'14.7.4 Notes'
(faltan páginas de manual de zsh)zsh
es muy configurable. En mi zshecho -extract=~/test
resulta en-extract=/home/user/test
. Está habilitado porMAGIC_EQUAL_SUBST
opciones. En una nota al margen, tengo todas las páginas de manual de zsh muy bien.zsh
es configurable y otras mejoras; Hubiera esperado que MAGIC_EQUAL_SUBST (cubierto en 14.7.4) no esté configurado de forma predeterminada y rara vez se use; Ahora, obviamente, es más relevante si lo tiene habilitado en general. Después de que mi sección de ejemplo esté en buena forma, sería una buena adición ...Solo arreglándolo
Este comando muestra un mensaje de error "ERROR: extract: la ruta debe ser absoluta":
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:
Si necesita la sintaxis de la opción con
=
, usar $ HOME en lugar de~
es la solución más limpia;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=
.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.
:
o=
$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 formafoo/bar/baz
, es una ruta relativaOtros usos
Si hay caracteres después de
~
, como en~alice
- con todas las demás reglas anteriores aplicadas - y hay un nombre de usuarioalice
, que se expande al directorio de inicio dealice
, digamoshome/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
ypopd
, en lugar decd
, 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
fuente
~
No es un camino per se. Es un personaje que recibe un tratamiento especial del shell donde~
o~/
significa "reemplazar con la ruta del directorio de inicio del usuario actual".~username
significa "reemplazar con la ruta del directorio de inicio del nombre de usuario".Debido a que no es una ruta, solo se reconoce en ciertos lugares del comando (como el primer carácter de una nueva ficha dividida en espacio).
Cuando se expande, se reemplaza con una ruta absoluta.
El uso
$HOME
funciona porque HOME es solo una variable establecida por el shell y sigue las reglas normales del shell para el reemplazo de variables (ocurre antes de que la entrada se divida en espacios y se ejecute).fuente
Estás en lo correcto. ~ / Downloads es lo mismo que / home / username / Downloads.
Algunos instaladores y extractores son muy exigentes con respecto a dónde necesita colocar las cosas. Creo que podría ser porque registra las rutas de los archivos, y los registros no aceptarán ~ en una ruta aceptada.
Solo me acostumbré a escribir / home / username en su lugar. :)
fuente