在osx bash

时间:2016-11-09 16:20:32

标签: bash escaping line-breaks double-quotes single-quotes

我使用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会错误地解释代码。我认为这也可能是其他脚本有这么多层引号的情况,所以我应该问一下是否有任何解决方法。

P.S。 在相关的说明中,似乎当我输入这个:

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

而不是:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

declare -f _sleep >>~/.profile

...或者,使用现有的editprofile功能:

editprofile "$(declare -f _sleep)"

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

如果您 想要走那条路,那么有办法可用;他们只是不同程度的不愉快。

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中为您提供一个函数声明,可以eval在本地执行,或附加到.profile,& c。

editprofile "$sleep_def"

......在这种情况下会表现得恰到好处。