Bash 伯恩外壳:将~/Desktop转换为/users/me/Desktop

Bash 伯恩外壳:将~/Desktop转换为/users/me/Desktop,bash,scripting,path,Bash,Scripting,Path,keytool无法解析公正的目录。也就是说,这是有效的: keytool -keystore "/users/me/Desktop" ... 这并不是: keytool -keystore "~/Desktop" ... 有什么东西我可以这样称呼: keytool -keystore "$(<cmd> ~/Desktop)" ... keytool-keystore“$(~/Desktop)”。。。 使现代化 我想我应该更具体一点: 这就是我正在做的: myVar=~/Des

keytool无法解析公正的目录。也就是说,这是有效的:

keytool -keystore "/users/me/Desktop" ...
这并不是:

keytool -keystore "~/Desktop" ...
有什么东西我可以这样称呼:

keytool -keystore "$(<cmd> ~/Desktop)" ...
keytool-keystore“$(~/Desktop)”。。。
使现代化 我想我应该更具体一点:

这就是我正在做的:

myVar=~/Desktop
<allow user to overwrite default value of myVar>
keytool -keystore "$myVar" ...
myVar=~/Desktop
keytool-密钥库“$myVar”。。。

我认为在keytool命令中不引用$myVar是不安全的,以防有人在其中放入恶意代码

我不认为这是一个编程问题,但您尝试过没有引号的问题吗?i、 e

keytool -keystore ~/Desktop ...

那是因为你引用了路径。Keytool或unix中的任何其他命令行程序都与wildrcards无关,因为shell用于实际扩展路径名。如果你不引用路径,它将运行良好。

eval echo“~/foo”

e、 keytool-keystore$(eval echo~/Desktop)

怎么样

keytool -keystore "$(echo ~/Desktop)"


但是,另一方面,~/桌面也应该可以正常工作。仅在bash上试用过,这里没有任何其他Bourne Shell。

虽然很可爱,但标签已经足够杂乱无章了。请不要创建不需要的新脚本。根据您的编辑,您肯定需要eval,因为shell不会递归地展开内容。这意味着它将扩展变量,而不是变量内部的内容您应该使用
$HOME
或parse
/etc/passwd
(例如使用
getent
)或类似的身份验证文件/服务。我认为
~
更多的是为了方便命令行。我对keytool一无所知,但我想说,基于$@的存在,这不一定是真的。双引号应该可以。单引号会将其视为文字字符串。对我来说是有效的。你确定你的结束语没有像你在评论中写的那样倒转吗?
keytool -keystore "$HOME/Desktop"