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

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++ 编写别名。有没有办法可以编写一个带参数的别名?我该怎么办?

Eli*_*gan 3

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

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

没有在替换文本中使用参数的机制,如 中那样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)

你可以:

  • 在命令行上运行它,只要当前 shell 正在运行,它就会被定义,仅在该 shell 实例中,或者
  • 将其添加到您的~/.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


Ser*_*nyy 2

然后当我去远程编译时

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

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