我可以写一个带参数的别名吗?

我可以写一个带参数的别名吗?

我有一些远程机器,需要编译一些源代码。我通常会写一个别名,内容如下:

alias g++='g++ `pkg-config --cflags opencv --libs opencv`'

然后,当我去远程编译时,我会这样做g++ -o test test.cpp

不管出于什么原因,Ubuntu 不允许我这样做。相反,当我执行以下操作时,Ubuntu 可以工作:

g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv`

但这意味着我无法为 g++ 编写别名。有没有办法可以编写一个可以接受参数的别名?我该怎么办?

答案1

总结:command g++在 shell 函数中使用,而不是g++在别名中使用。

作为6.6 别名在里面Bash 参考手册说:

没有在替换文本中使用参数的机制,如csh。如果需要参数,则应使用 shell 函数(请参阅Shell 函数)。

尽管别名即使出现在附加文本前面也会扩展,但别名本身并不支持位置参数(即命令行参数),因此您不能使用别名来执行当前任务。也就是说,您不能使用别名来运行带有用户指定参数的命令其次是附加参数。

正如您所发现的,您可以使用别名来g++ file.cpp -o file运行:

g++ `pkg-config --cflags opencv --libs opencv` file.cpp -o file

不是运行g++ file.cpp -o file这个命令:

g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv`

因此,如果你想要这样做,你可能需要使用shell 函数

g++ () {
    command g++ `pkg-config --cflags opencv --libs opencv` "$@"
}

你可以:

  • 在命令行上运行该命令,只要当前 shell 正在运行,它就会在该 shell 实例中被定义,或者
  • 将其添加到您的~/.bashrc文件中,然后启动一个新 shell 或运行. ~/.bashrc

这定义了名为 的函数g++。由于与别名不同,函数可以调用自身,因此我使用了command 内置以防止不良递归.command g++调用外部g++命令。"$@"扩展传递给函数的所有命令行参数。

在极少数情况g++需要作为别名,您可以“作弊”并将其定义为函数的别名(就像您可以为任何其他命令定义别名一样)。您可以通过先定义函数或每次在别名中定义它来实现这一点(如乔治建议)。但是,您无需这样做;一个函数就可以正常工作。

当然,你可能不会总是希望g++将的输出pkg-config --cflags opencv --libs opencv传递给它。因此,您可能希望将别名定义放在一个文件中,并仅在需要时才将其作为源。如果您的定义位于g++-fn.sh您的主目录中,那么要启用该功能,您可以运行:

. ~/g++-fn.sh

要禁用该功能(无论它如何定义),您可以运行:

unset -f g++

我应该补充一点,对于任何微型或琐碎的程序,你至少应该考虑使用make(而不是每次g++都用输出来调用自己),因为pkg-configsteeldriver 建议

答案2

然后当我去远程编译时

这就是你的主要问题。本地配置文件或本地交互式 shell 中定义的别名在远程系统上不起作用。在远程机器中定义别名,~/.bashrc它就会起作用。

更好的方法是定义一个函数,正如 Eliah 所建议的那样。但您仍然必须在远程机器上定义它,就像使用别名一样。

相关内容