Мне любопытно, почему мы не можем переключиться на домашнего директора пользователя с
$ cd ~"$USER"
или
$ cd ~${USER}
shell
command-line
Neo_Returns
источник
источник
Ответы:
Это очень сильно зависит от оболочки и порядка выполнения расширений в этих оболочках.
~$user
разворачивается в домашний каталог пользователя, имя которого хранится в$user
csh (откуда взялась эта~user
функция), AT & T ksh, zsh, fish.Обратите внимание на эти варианты:
Он расширяется до домашнего каталога пользователя, названного буквально
$user
вbash
(при условии, что пользователь существует, что, конечно, очень маловероятно).И ни в
pdksh
,dash
,yash
, по- видимому , потому что они не считают$user
, что действительное имя пользователя.источник
Расширение тильды - это отдельный шаг в обработке командной строки. Это происходит как раз перед расширением переменной.
Если за тильдой следует что-то отличное от косой черты, она развернется в домашний каталог пользователя, чье имя следует за тильдой, как, например, в
~otheruser
. Поскольку$USER
в этот момент он не раскрывается и вряд ли соответствует действительному имени пользователя, тильда остается нерасширенной.$USER
скорее всего, это имя пользователя текущего пользователя, поэтому ваше выражение может быть заменено просто~
.источник
Как уже указывалось в других ответах, поведение зависит от того, в каком порядке выполняется оболочка
~
и$
расширения, и будет ли она вообще выполнять одно и то же слово.Поведение, которое вы искали, может быть достигнуто
bash
очень маленьким изменением вашей команды. Просто добавьте к команде префиксeval
.изменится на домашний каталог пользователя, заданный именем пользователя в переменной
USER
, при условии, что$USER
он не содержит символов, специальных для оболочки (если есть вероятность, что это возможно, вы не должны передавать его в качестве аргумента,eval
поскольку это было бы опасно ) или/
символы и что есть запись для этого пользователя в базе данных пользователей системы.источник
Альтернативный способ поиска домашнего каталога переменной пользователя, если вы используете одну из оболочек, в которых расширение тильды происходит до расширения переменной, - с помощью getent . Этот инструмент существует как минимум в Linux, Solaris и FreeBSD; Я не уверен, насколько это универсально.
Как и в случае расширения тильды, это может не дать вам то же самое, что
su - $USER -c 'echo $HOME'
выглядело бы, если бы у вас были права для этого.источник
perl -le 'print((getpwnam shift)[7])' -- "$USER"
как потенциально чуть более переносимый.Поскольку ОП настаивает на ответе, вот оно.
Поведение этих команд (и многих других) зависит от конкретной оболочки, которую вы используете. Если вы не укажете, какую именно оболочку вы используете, возможно, будет невозможно дать простой ответ.
На самом деле, если вы используете tcsh, как и я, оба выражения в вопросе OP (как написано, когда я пишу это - я не несу ответственности за будущие правки!) Работают отлично. Я не знаю, что будут делать другие оболочки, так как я ими не пользуюсь. Так что, возможно, ОП не знает так много о том, что можно сделать, как он / она думает :-)
источник