提问人:JohnE 提问时间:12/1/2018 最后编辑:JohnE 更新时间:12/1/2018 访问量:187
在波浪号前展开变量
Expand variable before tilde
问:
我敢肯定以前有人问过这个问题,但我找不到任何东西。我们在共享机器上有难以理解的登录名,并希望使用 shell 变量来替换难以记住的登录名,以代替人们的真实姓名。
例如,假设 Omar 的登录名是 xyz123。我可以这样做:
$ omar=xyz123
$ echo ~$omar
输出看起来不错:
~xyz123
但是如果我输入这个:
$ ls ~$omar
出现错误:
ls: cannot access ~xyz123: No such file or directory
我认为这是因为波浪号扩展发生在变量扩展之前,但不知道如何解决这个问题。
也许这个答案是相关的,尽管我不确定: 如何在 bash 中手动扩展特殊变量(例如:~ 波浪号)
答:
3赞
glenn jackman
12/1/2018
#1
bash 在变量前展开波浪号。查看 https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions
shell 将查看文本字符是否为登录名。由于它们不是,波浪号不会扩展。shell 最终被视为一个变量并替换它。然后,它递出展开的单词,然后打印它。$
o
m
a
r
$omar
~xyz123
echo
同样,它将单词交给 .由于 ls 不进行自己的波浪号扩展,因此它会在当前目录中查找以文字波浪号命名的文件。由于这样的文件不存在,因此您会收到该错误。~xyz123
ls
~xyz123
如果要列出文件,则需要 .或者,由于 eval 被认为随便使用非常不安全,因此您可以这样做:ls ~$var
eval ls ~$var
ls "$(getent passwd "$omar" | cut -d: -f6)"
评论
1赞
bishop
12/1/2018
例如,后跟 -- 例如 .虽然没有那么方便,但最安全。home() { getent passwd ${1:?Missing user name} | cut -f6 -d:; }
ls "$(home $omar)"
~
0赞
KamilCuk
12/1/2018
#2
我会检查是否是有效的用户,然后使用强制双重扩展。所以防止邪恶,然后去做。"$omar"
id
eval
eval
if ! id "$omar" >/dev/null 2>&1;
echo "Error: user with the name $omar does not exist!" >&2
exit 1
fi
eval echo "\"~$omar\""
评论
~xyz123
xyz123
eval
omar
~
su
omar
cdable_vars
omarhome=/home/omar
cd omarhome
cd "$omarhome"
ls "$omarhome"