Estaba confundido, tratando de copiar algunos archivos de una PC a otra. Lo tengo resuelto, pero la sintaxis sigue siendo confusa para mí. Esto funciona:
scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b
que pone Volenteer.png
en la carpeta /home/j0h/b
. Sin embargo, esto no funciona:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
Esto también falla, dando un estado de salida 1 archivo no encontrado:
scp ~/Desktop/Volenteer.png jay@server.ip:~/j0h/b
Como hace esto:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
Claramente, hay alguna diferencia entre ~
y ~/
esa diferencia es la presencia de/
$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory
Entonces, ¿por qué en scp, la ~
resolución lo hace ~/
? Es una suposición, no puedo verificar que eso es lo que está sucediendo. Pero parece inconsistente y, por lo tanto, confuso. ¿Es esto un error en scp? o hay algo sobre tilde que me estoy perdiendo?
Respuestas:
~
es tu directorio personal~foo
es el directorio de inicio del usuariofoo
, si dicho usuario existe, o simplemente un directorio llamado~foo
, si ese usuario no existe.Por lo tanto, en:
~Desktop
se expandirá al directorio de inicio del usuarioDesktop
, si dicho usuario existe (y generalmente no existe), o será solo~Desktop
(una ruta que generalmente tampoco existe).En:
~/j0h
se expandirá a un directorio nombradoj0h
enjay
el directorio de inicio de '', que, nuevamente, es poco probable que exista.No es
~
y~/
dónde ocurre la diferencia, sino en~
y~foo
.Además,
~
también se puede utilizar para la navegación del historial del directorio:~-
es el directorio de trabajo anterior (como$OLDPWD
)~+
es el directorio de trabajo actual (como$PWD
)Esto no es aplicable
scp
, ya que no puede cambiar los directorios en medio de unascp
operación.Y si se utiliza
pushd
ypopd
para mantener una pila de directorios, y sería el directorio º en la pila de directorios, como se ve en la salida . sería el th directorio desde el final (contando desde cero, en ambos casos). Por ejemplo:~N
~+N
N
dirs
~-N
N
Luego, se puede acceder a los directorios en la pila usando:
fuente
~+
siempre es equivalente a.
entonces, ¿es eso correcto? Parece redundante~+
y~-
use los valores de$PWD
y$OLDPWD
, que son rutas absolutas..
Siempre es un camino relativo. Entonces, si hay un comando que cambia el directorio de trabajo actual cuando se ejecuta, verá la nueva ruta para.
, donde la ruta expandida~-
seguirá siendo la misma.tar -C
es un ejemplo, aunque admito que no puedo pensar en un buen uso para~+
.$PWD
sería igual de bueno, excepto que no necesita comillas~+/foo/bar
si$PWD
contiene espacios../filename
pero puedes usar"$PWD/filename"
o más simplemente~+/filename
. (Y algunos comandos funcionarán en nombres de ruta relativos, pero hay una diferencia funcional, comoln
otar
.)Lea la documentación de GNU para Bash Tilde Expansion (como debería haberlo hecho antes de mi primera iteración de esta respuesta).
~/Desktop
y~j0h
están haciendo cosas fundamentalmente diferentes, lo que explica por qué~Desktop
no funciona:Se
~
sustituye un plano por su$HOME
variable de entorno actual , establecida al iniciar sesión. Así lo~
resuelve/home/oli
para mí, y se~/Desktop
lee como/home/oli/Desktop
. Aquí es donde ves que se usa más la tilda.~username
se resuelve en el hogar de ese usuario , como se establece en/etc/passwd
. Así que~oli
resuelve/home/oli
,~j0h
podría resolverse/home/j0h
pero no necesariamente, su homedir puede estar en cualquier lugar.~not-a-username
no se resuelve PorqueDesktop
no es un usuario,~Desktop
no está sustituido. Se toma literalmente como un archivo o ruta llamada~Desktop
(que no existe aquí).Y no hace falta decir que todo esto ocurre de forma remota (sería inútil
scp
si se reemplazara con valores locales). Esto funciona porque Bash no sustituirá~...
si está precedido por otra cosa que no sea un espacio en blanco.fuente
getent passwd bin
dice~dir
es consistente con los documentos de GNU: "... los caracteres en el prefijo tilde que siguen a la tilde se tratan como un posible nombre de inicio de sesión ... Si el nombre de inicio de sesión no es válido o la expansión de tilde falla, la palabra no se modifica ". Aquí,dir
no es el nombre de un usuario en este sistema, por lo que no se modifica.El símbolo
~
se usa como acceso directo para/home/user
inbash
, por lo que en el caso de~/Desktop/Volenteer.png
que sea abreviado para/home/user/Desktop/Volenteer.png
.Como puede ver
/
, como siempre, muestra un nuevo nivel en la jerarquía del sistema de archivos.fuente
~{user}/
podría ser cualquier ruta aleatoria establecida por el archivo de base de datos passwd (5). Si bien sí, los estándares filesytem.org ubican a los usuarios regulares en / home, este no es el caso con todos los usuarios (es decir, root in / root y servicios en / var / ... o unixies anteriores que usan / usr en lugar de / home)/usr
.~
es la abreviatura de la variable de entorno$HOME
en la mayoría de los shells compatibles con derivados de c shell / POSIX compatibles. El uso más común~
es cuando se hace referencia a su propio directorio personal o al de la casa de otro usuario:Para encontrar el directorio de inicio de cualquier usuario local en un sistema POSIX (UNIX, Linux, OS X, BSD) que está utilizando la base de datos passwd (5) , ejecute awk de esta
/etc/passwd
manera:Esto mostrará una lista de cada usuario local y su directorio de inicio.
fuente