在波浪号前展开变量

Expand variable before tilde

提问人:JohnE 提问时间:12/1/2018 最后编辑:JohnE 更新时间:12/1/2018 访问量:187

问:

我敢肯定以前有人问过这个问题,但我找不到任何东西。我们在共享机器上有难以理解的登录名,并希望使用 shell 变量来替换难以记住的登录名,以代替人们的真实姓名。

例如,假设 Omar 的登录名是 xyz123。我可以这样做:

$ omar=xyz123
$ echo ~$omar

输出看起来不错:

~xyz123

但是如果我输入这个:

$ ls ~$omar

出现错误:

ls: cannot access ~xyz123: No such file or directory

我认为这是因为波浪号扩展发生在变量扩展之前,但不知道如何解决这个问题。

也许这个答案是相关的,尽管我不确定: 如何在 bash 中手动扩展特殊变量(例如:~ 波浪号)

bash shell 变量 波浪号扩展

评论

0赞 bishop 12/1/2018
供参考:wiki.bash-hackers.org/syntax/expansion/tilde
0赞 KamilCuk 12/1/2018
输出看起来“很好”,但它不是主目录的路径。~xyz123xyz123
2赞 Jonathan Leffler 12/1/2018
没有一个可能的解决方法很有吸引力。嘀咕咕的辱骂词不会让我受到安全人员的喜爱——他们对此没有责任。eval
1赞 chepner 12/1/2018
退一步说,我想说的是,很少有人需要别人的主目录,反正其他人不一定可以访问。脚本将由 运行,在这种情况下,您将只使用 ,或者脚本将以 root 身份运行,他们可以根据需要使用 成为。omar~suomar
1赞 chepner 12/1/2018
您可能希望改用该选项;添加一个变量,例如(手动查找一次并将值存储在变量中),然后将等价于 。(当然,其他命令必须更明确地使用该变量,例如 .)cdable_varsomarhome=/home/omarcd omarhomecd "$omarhome"ls "$omarhome"

答:

3赞 glenn jackman 12/1/2018 #1

bash 在变量展开波浪号。查看 https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions

shell 将查看文本字符是否为登录名。由于它们不是,波浪号不会扩展。shell 最终被视为一个变量并替换它。然后,它递出展开的单词,然后打印它。$omar$omar~xyz123echo

同样,它将单词交给 .由于 ls 不进行自己的波浪号扩展,因此它会在当前目录中查找以文字波浪号命名的文件。由于这样的文件不存在,因此您会收到该错误。~xyz123ls~xyz123

如果要列出文件,则需要 .或者,由于 eval 被认为随便使用非常不安全,因此您可以这样做:ls ~$vareval 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"idevaleval

if ! id "$omar" >/dev/null 2>&1; 
   echo "Error: user with the name $omar does not exist!" >&2
   exit 1
fi
eval echo "\"~$omar\""