我使用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文件,脚本不起作用。是因为换行吗?
答案 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"
......在这种情况下会表现得恰到好处。