如何在传递给 bash 函数之前评估 bash 别名?

如何在传递给 bash 函数之前评估 bash 别名?

我将测试别名定义为:

alias testalias='python3 -c "f = open(\"/tmp/testopenfile\", \"w+\"); f.write(\"hi\n\")"'

当我直接通过终端运行它时,它工作得很好。我可以正常 cat /tmp/testopenfile 。我还定义了一个辅助函数来后台和静音错误以及程序的输出。我想将此函数与一些需要很长时间或处于 while 循环中的别名一起使用(不是这个只是一个例子)。它的定义如下:

detach is a function
detach ()
{
    $1 > /dev/null 2> /dev/null &
}

我正在使用 bash,并且尝试将这两件事结合起来。当我尝试时detach testalias,它似乎不起作用(/tmp/testopenfile 似乎没有创建)。看起来 testalias 是直接通过的,而不是评估的。在通过之前进行此评估的技巧是什么。

另外,此代码创建文件:

python3 -c "f = open(\"/tmp/testopenfile\", \"w+\"); f.write(\"hi\n\")" 1>/dev/null 2>/dev/null &

答案1

将别名替换为函数。

testalias() {
    python3 -c 'f = open("/tmp/testopenfile", "w+"); f.write("hi\n")'
}
detach ()
{
    "$@" > /dev/null 2> /dev/null &
}

Bash 只查看命令的第一个单词来进行别名扩展,因此该函数获取文字参数testalias。 (我认为 zsh 具有“全局”别名,可以在命令行上的任何位置扩展,但我怀疑您是否希望echo testalias扩展别名内容。)

别名扩展也发生在解析过程的早期,即$1扩展之前,因此当函数运行时,$1扩展为相同的testalias,并保持原样。它可能会给你一个关于找不到命令的错误testalias,除了 stderr 被重定向到/dev/null,所以你看不到错误。

事实上,当函数被调用时,函数中的别名就会被扩展。解析的,而不是在使用时。

$ alias foo="echo abc"
$ f() { foo; }
$ alias foo="echo def"
$ g() { foo; }
$ f
abc
$ g
def

对于testalias函数来说,当testalias查找命令时就会找到它。

相关内容