我可以写一个带参数的别名吗?
我有一些远程机器,我需要编译一些源代码。 我通常做的是写一个别名,它说:
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
定义别名,然后就可以了。
正如埃利亚所建议的那样,更好的方法是定义一个函数。 但是你仍然需要在远程机器上定义它,就像使用别名一样。