cd ~<пользователь> возможен, но почему мы не можем переключиться на домашний директор пользователя с помощью либо cd ~"$USER", либо cd ~${USER}

words = wc -w > $file

the ]> char здесь кажется неуместным. Без него вы бы считали строки в $ file , но в настоящее время вы подсчитываете строки стандартного ввода и выводите результат в $ file .

8
17.05.2018, 17:43
5 ответов

Eso depende mucho del caparazón y del orden en que se realicen las expansiones en esos caparazones.

~$userse expande al directorio de inicio del usuario cuyo nombre está almacenado en $useren csh (de donde proviene esa función ~user), AT&T ksh, zsh, fish.

Tenga en cuenta, sin embargo, estas variaciones:

$ u=daemon/xxx csh -c 'echo ~$u'
/usr/sbin/xxx  # same in zsh/fish
$ u=daemon/xxx ksh93 -c 'echo ~$u'
~daemon/xxx

$ u=daemon/xxx csh -c 'echo ~"$u"'
Unknown user: daemon/xxx.
$ u=daemon/xxx zsh -c 'echo ~"$u"'
/usr/sbin/x  # same in fish

$ u=" daemon" csh -c 'echo ~$u'
/home/stephane daemon
$ u=" daemon" zsh -c 'echo ~$u'
~ daemon  # same in ksh/fish

$ u="/daemon"  csh -c 'echo ~$u'
/home/stephane/daemon  # same in zsh
$ u="/daemon"  fish -c 'echo ~$u'
~/daemon  # same in ksh

Se expande al directorio de inicio del usuario nombrado literalmente $userenbash(siempre que ese usuario exista, lo cual es muy poco probable, por supuesto ).

Y a ninguno en pdksh, dash, yash, presumiblemente porque no consideran que $usersea un nombre de usuario válido.

20
27.01.2020, 20:08

La expansión de tilde es un paso separado en el procesamiento de la línea de comando. Ocurre justo antes de expansión variable.

Si la tilde va seguida de algo que no sea una barra inclinada, se expandirá al directorio de inicio del usuario cuyo nombre sigue a la tilde, como, por ejemplo, ~otheruser. Dado que $USERno se expande en ese punto y dado que es poco probable que corresponda a un nombre de usuario válido, la tilde se deja sin expandir.

Es probable que

$USERsea el nombre de usuario del usuario actual, por lo que su expresión probablemente podría reemplazarse solo por ~.

10
27.01.2020, 20:08

Una forma alternativa de buscar el directorio de inicio de un usuario variable, si está utilizando uno de los shells donde la expansión de tilde ocurre antes de la expansión variable, es con getent . Esta herramienta existe al menos en Linux, Solaris y FreeBSD; No estoy seguro de cuán universal es.

$ USER=bloggs
$ getent passwd "$USER" | cut -d: -f6
/home/b/bloggs

Al igual que con la expansión de tilde, es posible que esto no le brinde lo mismo que su - $USER -c 'echo $HOME'imprimiría si tuviera los privilegios para hacerlo.

3
27.01.2020, 20:08

Como han señalado otras respuestas, el comportamiento depende del orden en que el shell realiza las expansiones ~y $y si incluso hará ambas cosas para la misma palabra.

Es posible lograr el comportamiento que estaba buscando en bashcon un cambio muy pequeño en su comando. Simplemente prefije el comando con eval.

eval "cd ~$USER"

cambiará al directorio de inicio del usuario proporcionado por el nombre de usuario en la variable USER, siempre que $USERno contenga caracteres especiales para el shell (si existe una posibilidad remota de que así sea,no debe pasarlo como argumento a evalya que sería peligroso )o /caracteres y hay una entrada para ese usuario en la base de datos de usuarios del sistema.

6
27.01.2020, 20:08

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é usando. 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 (tal como está escrito mientras escribo esto -¡No me hago responsable de futuras ediciones! )funcionan perfectamente bien.No sé qué harán otras conchas, ya que no las uso. Entonces, quizás el OP no sabe tanto sobre lo que se puede hacer como piensa:-)

-2
27.01.2020, 20:08

Теги

Похожие вопросы