Cita de bash manual(con énfasis añadido):
If a word begins with an unquoted tilde character (`~'), all of the characters 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 following the tilde are treated as a possible login name.
~foo
se expande al foo
directorio de inicio del usuario exactamente como se especifica en /etc/passwd
. Tenga en cuenta que esto puede incluir nombres de usuario del sistema; no significa necesariamente que los usuarios humanos o que realmente puedan iniciar sesión localmente (, pueden iniciar sesión a través de claves SSH, por ejemplo ).
De hecho, como se indica en los comentarios , bash
utilizará la función getpwnam
. Esa función en sí está especificada por el estándar POSIX , por lo tanto, debería existir en la mayoría de los sistemas similares a Unix -, incluido macOS X . Esta función no se limita solo a /etc/passwd
y busca en otras bases de datos, como LDAP y NIS. Extracto particular del código fuentebash
, archivo tilde.c
, que comienza en la línea 394:
/* No preexpansion hook, or the preexpansion hook failed. Look in the
password database. */
dirname = (char *)NULL;
#if defined (HAVE_GETPWNAM)
user_entry = getpwnam (username);
#else
user_entry = 0;
A continuación puede ver pruebas con nombres de usuario del sistema en mi sistema.Preste atención a la entrada correspondiente passwd
y al resultado dels ~username
$ grep '_apt' /etc/passwd
_apt:x:104:65534::/nonexistent:/bin/false
$ ls ~_apt
ls: cannot access '/nonexistent': No such file or directory
$ grep '^lp' /etc/passwd
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
$ ls ~lp
ls: cannot access '/var/spool/lpd': No such file or directory
Incluso si, por ejemplo, la cuenta _apt
está bloqueada como sugiere el resultado de passwd -S apt
, aún aparece como posible nombre de inicio de sesión:
_apt L 11/29/2017 0 99999 7 -1
Tenga en cuenta:Esta no es una función específica de macOS, sino una función específica de shell -.
Используйте << - EOF
вместо << EOF
, если хотите использовать отступ. Затем сделайте отступ текста табуляцией.
Наконец, вам нужно поставить EOF
, чтобы отметить конец здесь-документа.
Ваш кодовый блок будет иметь вид:
ftp -inv $HOST <<-EOF
user $USER $PASSWORD
cd /work/test//$input_variable/path/to destination/
mput x.csv
EOF
См. Также http://www.tldp.org/LDP/abs/html/here-docs.html , пример 19.4 для получения дополнительной информации.