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

我有一些远程机器,我需要编译一些源代码。 我通常做的是写一个别名,它说:

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 ++编写别名。 有没有办法可以写一个会引用争论的别名? 我该怎么办?

TL; DR: 在shell函数中使用command g++而不是别名中的g++

正如Bash参考手册中的6.6个别名所说:

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

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

如您g++ file.cpp -o file ,您可以使用别名来运行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 . ~/.bashrc

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

在非常罕见的情况下, g++确实需要成为别名,您可以“欺骗”并将其定义为函数的别名(就像您可以为任何其他命令定义别名一样)。 你可以通过首先定义函数或者每次在别名中定义函数来做到这一点(正如乔治建议的那样 )。 但是,你没有必要这样做; 一个函数可以正常工作。

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

 . ~/g++-fn.sh 

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

 unset -f g++ 

我应该补充一点,除了微小的或其他微不足道的程序之外,你应该至少考虑使用make (而不是每次使用pkg-config的输出来调用g++ ),正如steeldriver建议的那样 。

然后我去远程编译

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

正如埃利亚所建议的那样,更好的方法是定义一个函数。 但是你仍然需要在远程机器上定义它,就像使用别名一样。