0

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

PS 在相关说明中,当我输入以下内容时,似乎是:

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

而不是这个:

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

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

4

1 回答 1

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,可以eval编辑它以在本地执行它,或附加到您的.profile, &c 中。

editprofile "$sleep_def"

...将在这种情况下适当地表现。

于 2016-11-09T16:29:11.250 回答