j0h*_*j0h 5 command-line bash compiling alias g++
我有一些远程机器,我需要在那里编译一些源代码。我通常做的是写一个别名,它说的是:
alias g++='g++ `pkg-config --cflags opencv --libs opencv`'
Run Code Online (Sandbox Code Playgroud)
然后当我去远程编译时,我会做g++ -o test test.cpp
.
无论出于何种原因,Ubuntu 不会让我这样做。相反,当我这样做时,Ubuntu 可以工作:
g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv`
Run Code Online (Sandbox Code Playgroud)
但这意味着我不能为 g++ 编写别名。有没有办法可以编写一个带参数的别名?我该怎么办?
TL;DR:在 shell 函数中使用command g++
而不是g++
在别名中使用。
没有在替换文本中使用参数的机制,如 中那样
csh
。如果需要参数,则应使用 shell 函数(请参阅Shell 函数)。
虽然别名即使出现在其他文本前面也会展开,但别名本身不支持位置参数(即命令行参数),因此您不能使用别名来执行当前任务。也就是说,您不能使用别名来运行带有用户指定参数和附加参数的命令。
正如您所发现的,您可以使用别名来运行g++ file.cpp -o file
:
g++ `pkg-config --cflags opencv --libs opencv` file.cpp -o file
Run Code Online (Sandbox Code Playgroud)
但不要运行g++ file.cpp -o file
此命令:
g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv`
Run Code Online (Sandbox Code Playgroud)
因此,如果您想要这样,您可能需要使用shell 函数:
g++ `pkg-config --cflags opencv --libs opencv` file.cpp -o file
Run Code Online (Sandbox Code Playgroud)
你可以:
~/.bashrc
文件中,然后启动一个新的 shell 或运行. ~/.bashrc
.这定义了名为 的函数g++
。由于与别名不同,函数可以调用自身,因此我使用command
内置函数来防止不需要的递归。command g++
调用外部g++
命令。"$@"
扩展到传递给函数的所有命令行参数。
在极少数确实g++
需要别名的情况下,您可以“作弊”并将其定义为函数的别名(就像您可以定义任何其他命令的别名一样)。您可以通过首先定义函数或每次在别名中定义它来实现这一点(正如George 建议的那样)。然而,您没有必要这样做;一个函数就能正常工作。
当然,您可能并不总是希望g++
将pkg-config --cflags opencv --libs opencv
输出传递给它。因此,您可能希望将别名定义放入文件中,并仅在需要时才获取它。如果您的定义位于g++-fn.sh
主目录中,则要启用该功能,您可以运行:
. ~/g++-fn.sh
Run Code Online (Sandbox Code Playgroud)
要禁用该功能(无论它是如何定义的),您可以运行:
unset -f g++
Run Code Online (Sandbox Code Playgroud)
我应该补充一点,对于除了微小或其他琐碎程序之外的任何程序,您至少应该考虑使用make
(而不是每次g++
调用自己的输出),正如steeldriver所建议的那样。pkg-config
然后当我去远程编译时
这是你的主要问题。本地配置文件或本地交互式 shell 中定义的别名在远程系统上不起作用。在远程计算机中定义别名~/.bashrc
,然后它将起作用。
正如 Eliah 建议的那样,更好的方法是定义一个函数。但您仍然需要在远程计算机上定义它,就像使用别名一样。