在osx bash中转义多层级联单引号和双引号

Posted

技术标签:

【中文标题】在osx bash中转义多层级联单引号和双引号【英文标题】:Escaping many layers of cascaded single and double quotes in osx bash 【发布时间】:2016-11-09 16:20:32 【问题描述】:

我使用的是 Mac (osx sierra),并且一直在学习如何使用 bash。我正在尝试新的东西,同时我也掌握了一些概念。这次我在试验函数和别名。但后来我无法解决这个问题:

我首先将此函数回显到 .profile 中,以便将新别名和函数轻松插入 .profile 文件中。

function editprofile()
echo "$@" >> ~/.profile

这个函数对于一些别名插入非常有效。但是在我尝试为使我的 mac 睡眠的脚本(下面的脚本)插入一个别名后,我意识到该函数使用级联单引号和双引号会产生一些困难。我相信大多数使用大量单引号和双引号层的脚本都会出现这种情况。

osascript -e 'tell application "Finder" to sleep' && exit

下面的代码是我尝试使用我的函数将上面的代码作为别名插入到 .profile 中。

editprofile 'alias _sleep=' "'" 'osascript -e' "'" 'tell application "Finder" to sleep' "'" '&& exit' "'"

问题是当第二个脚本回显到 .profile 文件时,我还是应该保留一些转义字符,否则 bash 会错误地解释代码。我认为可能其他具有这么多引号层的脚本也会出现这种情况,所以我应该问是否有任何解决方法。

附: 在相关的注释中,当我输入以下内容时似乎:

function editprofile()echo "$@" >> ~/.profile

而不是这个:

function editprofile()
echo "$@" >> ~/.profile

进入 .profile 文件,脚本不起作用。是因为换行吗?

【问题讨论】:

别名?为什么要使用别名?如果你使用一个函数,你可以要求 shell 以正确引用的形式代表你发出它。 好吧,我是新手。你能更深入地解释一下吗? 顺便说一句,function 关键字会阻止您的代码与 POSIX 兼容,但对标准定义的函数声明语法没有任何好处。考虑避免它。 我只想通过键入 _sleep 或 slp 或类似的东西而不是所有 osascript 的东西来使 mac 睡眠。至少那是我一开始的目的。 直接编辑你的.profile;无需通过让函数为您编辑文件来增加额外的复杂性。 【参考方案1】:

假设你有一个函数,而不是别名:

_sleep()  osascript -e 'tell application "Finder" to sleep' && exit; 

...您可以使用declare -f 发出其文本。因此:

declare -f _sleep >>~/.profile

...或者,使用您现有的editprofile 函数:

editprofile "$(declare -f _sleep)"

最简单的方法就是:在本地 shell 中定义函数,然后让 shell 自己完成发出它的工作 - 并引用发出的内容,这样它就不会得到字段- 拆分成单独的参数(然后将这些参数单独评估为 glob)。


如果您想走那条路,可以使用一些方法;他们只是不同程度的不愉快。

printf -v cmd_var '%q ' osascript -e 'tell application "Finder" to sleep' 

...会将正确引用的内容放入"$cmd_var"。然后你可以:

printf -v sleep_def '_sleep()  %s && exit; ' "$cmd_var"

...这将在sleep_dev 中为您提供一个函数声明,可以evaled 以在本地执行它,或附加到您的.profile 等。

editprofile "$sleep_def"

...将在该上下文中适当地表现。

【讨论】:

以上是关于在osx bash中转义多层级联单引号和双引号的主要内容,如果未能解决你的问题,请参考以下文章

php 使用PHP在XPath查询中转义单引号和双引号的函数

如何在 Bash 中转义双引号? [复制]

在 bash 脚本中转义引号和大括号的问题

如何在 Bash/Grep 中转义单引号?

如何在 ssh / 远程 bash 命令中转义单引号字符?

使用 Javascript 在 HTML5 数据属性中转义引号