Tengo curiosidad por qué no podemos cambiar al director de casa de un usuario con
$ cd ~"$USER"
o
$ cd ~${USER}
shell
command-line
Neo_Returns
fuente
fuente
Respuestas:
Eso depende mucho del caparazón y del orden en que se realizan las expansiones en esos caparazones.
~$user
se expande al directorio de inicio del usuario cuyo nombre se almacena en$user
csh (de donde~user
proviene esa característica), AT&T ksh, zsh, fish.Sin embargo, tenga en cuenta estas variaciones:
Se expande al directorio de inicio del usuario nombrado literalmente
$user
enbash
(siempre que exista el usuario, lo cual es muy poco probable, por supuesto).Y ni en
pdksh
,dash
,yash
, presumiblemente debido a que no consideran$user
que ser un nombre de usuario válido.fuente
La expansión de Tilde es un paso separado en el procesamiento de la línea de comando. Sucede justo antes de la expansión variable.
Si la tilde es seguida por algo que no sea una barra inclinada, se expandirá al directorio de inicio del usuario cuyo nombre sigue a la tilde, como en, por ejemplo
~otheruser
,. Como$USER
no se expande en ese punto y es poco probable que corresponda a un nombre de usuario válido, la tilde se deja sin expandir.$USER
es probable que sea el nombre de usuario del usuario actual, por lo que su expresión probablemente podría reemplazarse por solo~
.fuente
Como otras respuestas han señalado, el comportamiento depende del orden que haga el shell
~
y las$
expansiones, y de si incluso hará ambas cosas por la misma palabra.Es posible lograr el comportamiento que estaba buscando
bash
mediante un cambio muy pequeño en su comando. Simplemente prefija el comando coneval
.cambiará al directorio de inicio del usuario dado por el nombre de usuario en la variable
USER
, siempre$USER
que no contenga caracteres especiales para el shell (si existe una remota posibilidad de que pueda, no debe pasarlo como argumentoeval
ya que sería peligroso ) o/
caracteres y que hay una entrada para ese usuario en la base de datos de usuarios del sistema.fuente
Una forma alternativa de buscar el directorio de inicio de un usuario variable, si está utilizando uno de los shells donde se produce la expansión de tilde antes de la expansión variable, es con getent . Esta herramienta existe en al menos Linux, Solaris y FreeBSD; No estoy seguro de cuán universal es.
Al igual que con la expansión de tilde, esto podría no darle lo mismo que
su - $USER -c 'echo $HOME'
imprimiría si tuviera los privilegios para hacerlo.fuente
perl -le 'print((getpwnam shift)[7])' -- "$USER"
como potencialmente un poco más portátil.Dado que el OP insiste en una respuesta, aquí está.
El comportamiento de esos comandos (y muchas otras cosas) depende del shell particular que esté utilizando. A menos que especifique qué shell en particular usa, probablemente no sea posible dar una respuesta simple.
De hecho, si usa tcsh, como lo hago yo, ambas expresiones en la pregunta del OP (como está escrito mientras escribo esto, ¡no me responsabilizo por futuras ediciones!) Funcionan perfectamente. No sé qué harán otros proyectiles, ya que no los uso. Entonces, quizás el OP no sabe tanto sobre lo que se puede hacer como piensa :-)
fuente