是否可以在 bash 中定义宏函数,所以当我编写时:
F(sth);
bash 运行这个:
echo "sth" > a.txt;
不能使任意语法做任何事情。括号是对解析器具有特殊含义的元字符,因此您无法将它们用作有效名称。扩展外壳的最好方法是定义函数。
这将是一个echo
始终写入同一个文件的基本包装器:
f() {
echo "$@"
} >a.txt
这大致相同,但另外处理标准输入 - 牺牲echo's
-e
和-n
选项:
f() {
[[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}"
} >a.txt
可以称为
f arg1 arg2...
或者
f <file
函数以与任何其他命令相同的方式传递参数。
第二个类似回声的包装器首先测试设置的第一个参数或来自非 tty 的标准输入,并使用位置参数(如果已设置)或标准输入有条件地调用 printf。测试表达式避免了零参数和没有从文件重定向的情况,在这种情况下,Bash 会尝试扩展终端的输出,挂起 shell。
F () {
echo "$1" > a.txt
}
调用它时不要使用括号。这就是你所说的:
F "text to save"
这是很久以前回答的,但是为了提供一个满足原始请求的答案(即使这可能不是真正想要的):这是基于Simon Tatham的 Magic Aliases: A Layering Loophole in the Bourne Shell。
F() { str="$(history 1)"; str=${str# *F(}; echo "${str%)*}"; } >a.txt
alias F='\F #'
$ F(sth)
$ cat a.txt
sth
另请参阅 ormaaj更好的魔术别名。