【问题标题】:Is it possible in bash to work with a folder containing a tilde (~) and spaces?在 bash 中是否可以使用包含波浪号 (~) 和空格的文件夹?
【发布时间】:2017-02-22 12:31:14
【问题描述】:

在 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 (My Company)"),所以我不需要扩展。但我认为它应该与扩展、空格和括号一起使用。

我正在寻找一个明智的解决方案。

【问题讨论】:

  • /Users/xxx/ 是否对应于该用户的 $HOME 值?
  • ~ 是如何获得该值的?一开始就不应该使用它。它是路径名的特定于 shell 的快捷方式,不应用于存储路径名。
  • @Inian:是的,是的。我只是不想把我的用户名放在 stackoverflow 上。
  • @chepner:为什么我不能将~ 存储在路径名中?如果我的管理员决定重新定位用户文件夹,我不想更新我的设置...
  • shell 以外的其他程序使用默认系统,不一定知道波浪号是什么意思。 ~/Dropbox (My Company)/ 本身就不是一个有效的路径名。

标签: bash macos


【解决方案1】:

我不知道 bash 在 OS X 上的工作方式是否有所不同,但这似乎是仅扩展波浪号并保持引用其余部分的方式:

my_key_escaped=$(printf %q "$my_key")
eval my_key_expanded=${my_key_escaped/#\\~/~}

首先引用所有内容(空格、波浪号、美元...),然后取消引用前导 \~(如果存在)。

【讨论】:

  • +1 虽然这只能正确处理最简单的波浪号扩展形式(波浪号后面没有用户名,如~jsmith/bin)。
  • 以下函数也将处理其他形式的波浪号扩展:expand_tilde() { local s="$(printf %q "$1")"; s="${s/\\~/'~'}"; eval echo "$s"; }
  • 我认为您不需要 /#\\~/~ 部分。当结果被转义时,它可以被 eval-ed,并且 eval 正在处理 ~ 部分。
  • 当它被转义时,前导的~ 将变成\~——这些将是my_key_escaped 值的第一个字符。然后如果你写eval my_key_expanded=$my_key_escaped,bash 会将该行扩展为eval my_key_expanded=\~/Dropbox (My Company)/,eval 确实会将字符串转义为my_key_expanded=~/Dropbox (My Company)/,结果将被执行,在这种情况下,字符串以~ 开头而不是/home/username 将存储在 my_key_expanded 中。这至少是我尝试时 bash 给我的。
【解决方案2】:

无法正常工作:从另一个堆栈溢出问题中,我得到了一个优雅但“hacky”的答案:

my_key=$(cd "$my_key";pwd)

我以为我找到了一个简单的答案...如果您想要简单,请不要在路径名中使用特殊字符..

我将此答案作为如何不做的指针。

【讨论】:

  • 唯一的问题是当my_key包含~时它不起作用。
  • 啊,你是对的。我以为我找到了一个简单的答案...如果您想要简单,请不要在路径名中使用特殊字符;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 2016-11-04
  • 2012-03-08
  • 2014-07-15
  • 2011-06-06
相关资源
最近更新 更多