在波浪号之前展开变量



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

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

$ omar=xyz123
$ echo ~$omar

输出看起来不错:

~xyz123

但是如果我输入这个:

$ ls ~$omar

有一个错误:

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

我认为这是因为波浪号扩展发生在变量扩展之前,但无法弄清楚如何解决这个问题。

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

bash 在变量之前扩展波浪号。请参阅 https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions

外壳将查看文字字符$omar是否为登录名。由于它们不是,因此波浪号不会扩展。shell 最终将$omar视为变量并替换它。然后,它将展开的单词~xyz123交给echo,只是打印它。

同样,它将~xyz123一词交给ls。由于 ls 不执行自己的波浪号扩展,因此它会在当前目录中查找一个名为~xyz123的文件,其中包含文字波浪号。由于这样的文件不存在,因此会出现该错误。

如果要ls ~$var列出文件,则需要eval ls ~$var。或者,由于 eval 被认为随意使用非常不安全,您可以改为这样做:

ls "$(getent passwd "$omar" | cut -d: -f6)"

我会检查"$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""

相关内容

  • 没有找到相关文章

最新更新