在bash脚本中,我想使用存储在默认系统中的值。要检索该值,我会这样做:
defaults read my.domain my_key
#returns "~/Dropbox (My Company)/"
当我在bash脚本中执行以下操作时,波形符(〜)不会被展开(我因为简洁而删除了错误处理):
my_key=$(defaults read my.domain my_key)
echo $my_key
#output: "~/Dropbox (My Company)/"
基本上,这个问题可以证明:
my_key='~/Dropbox (My Company)/'
echo $my_key
波浪线未展开,因为文件名在引号之间(不确定它是否与此完全相同)。当我想强制波浪扩展时,它会抱怨括号(-bash: syntax error near unexpected token '('
):
eval my_key='~/Dropbox (My Company)/'
目前,我只是将完整路径保存到默认系统(默认为my.domain my_key -string“/ Users / xxx / Dropbox(我的公司)”),所以我不需要扩展。但我认为它应该适用于扩展,空格和括号。
我正在寻找合理的解决方案。
答案 0 :(得分:3)
我不知道bash在OS X上的工作方式是否有所不同,但这似乎是仅扩展代字号并保持其余部分引用的方式:
my_key_escaped=$(printf %q "$my_key")
eval my_key_expanded=${my_key_escaped/#\\~/~}
首先引用所有内容(空格,代字号,美元......)然后取消引用前导\~
(如果它在那里)。
答案 1 :(得分:-1)
无法正常工作:从另一个堆栈溢出问题,我来到了一个优雅的,但是#34; hacky",回答:
my_key=$(cd "$my_key";pwd)
我以为我找到了一个简单的答案......如果你想要简单,不要在路径名中使用特殊字符..
我把这个答案作为指针,如何不这样做。