【发布时间】:2012-04-28 12:07:19
【问题描述】:
是否可以在 bash 中定义宏函数,所以当我编写时:
F(sth);
bash 运行这个:
echo "sth" > a.txt;
【问题讨论】:
是否可以在 bash 中定义宏函数,所以当我编写时:
F(sth);
bash 运行这个:
echo "sth" > a.txt;
【问题讨论】:
F () {
echo "$1" > a.txt
}
调用时不要使用括号。这就是你的称呼:
F "text to save"
【讨论】:
【讨论】:
不能让任意语法做任何事情。括号是元字符,对解析器具有特殊意义,因此您无法将它们用作有效的名称。扩展 shell 的最佳方式是定义函数。
这将是一个基本的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
函数以与任何其他命令相同的方式传递参数。
第二个类似 echo 的包装器首先测试 set first argument 或来自非 tty 的标准输入,并使用位置参数(如果已设置)或标准输入有条件地调用 printf。测试表达式避免了零参数和没有从文件重定向的情况,在这种情况下,Bash 会尝试扩展终端的输出,挂起 shell。
【讨论】:
cat 可以实现稍微更便携但速度更慢的解决方案 - 这需要具有真正 /dev/fd/* 的系统。我刚刚发布了这个技巧,因为我之前的答案与其他答案相同。 :)
echo 一样。您的函数适用于f one two three,而其他函数仅适用于f "one two three"。给定没有引号的输入,其他解决方案只会考虑第一个单词(这里:“one”)。
这是很久以前回答的,但要提供一个满足原始请求的答案(即使这可能不是真正想要的): 这是基于 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 的 better magic alias。