10

是否可以在 bash 中定义宏函数,所以当我编写时:

F(sth);

bash 运行这个:

echo "sth" > a.txt;
4

4 回答 4

17

不能使任意语法做任何事情。括号是对解析器具有特殊含义的元字符,因此您无法将它们用作有效名称。扩展外壳的最好方法是定义函数。

这将是一个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。

于 2012-04-17T06:45:22.457 回答
8
F () {
  echo "$1" > a.txt
}

调用它时不要使用括号。这就是你所说的:

F "text to save"
于 2012-04-17T06:42:51.733 回答
3

是的,只有你应该用以下方式调用它F sth

F()
{
  echo "$1" > a.txt
}

在这里阅读更多。

于 2012-04-17T06:43:35.210 回答
2

这是很久以前回答的,但是为了提供一个满足原始请求的答案(即使这可能不是真正想要的):这是基于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更好的魔术别名

于 2018-11-29T23:02:56.197 回答