我有一些远程机器,需要编译一些源代码。我通常会写一个别名,内容如下:
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++
在别名中使用。
没有在替换文本中使用参数的机制,如
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-config
steeldriver 建议。
答案2
然后当我去远程编译时
这就是你的主要问题。本地配置文件或本地交互式 shell 中定义的别名在远程系统上不起作用。在远程机器中定义别名,~/.bashrc
它就会起作用。
更好的方法是定义一个函数,正如 Eliah 所建议的那样。但您仍然必须在远程机器上定义它,就像使用别名一样。