Makefile 添加 shell 别名

3

我已经在使用一个makefile,希望能够将一些有用的别名存储在其中,以便用户可以调用。我知道可以创建一个bash文件并在其中构建别名,然后使用source运行它,这样我就可以做类似于:

# File: aliases.sh
alias useful="command to run"
alias also-useful="another command -to run"

然后我可以在当前终端会话中运行以下命令:

source ./aliases.sh

使用Makefile

我希望能够通过Makefile实现类似的功能。我希望可以有一个简单的aliases条目,这样用户只需运行:

make aliases

如果可能的话,我更倾向于避免添加额外的文件,因为我不想为这样简单的任务添加额外的文件。如果您有更好的建议,我也愿意听取。


source ./aliases.sh 有什么问题吗? - user8680478
我希望这是我的构建过程的一部分。因此,如果用户调用 make development,它将运行启动开发所需的各种任务。将这些别名作为预步骤添加到他们的开发环境中会很好。我也不想有文件杂乱无章,因为我有几个类似的用例,因此最好只有一个文件来处理这个问题。 - user2662833
你想要的是别名(aliases),而不是配方(recipes),对吗?通常情况下,别名通过系统范围的 shell 设置或每个用户的个人资料或运行控制文件(例如 ~/.bashrc)进行处理。这是必要的,因为它们会影响 shell 环境,无论是通过后续脚本还是 makefile,都不能影响父级环境(例如用户的 shell)。登录后设置其他别名的唯一方法是在命令行上使用 source 命令,否则别名只会存在于特定的子 shell 中。所以现在有点不清楚你想要什么。 - David C. Rankin
是的,我确实想向父Shell添加命令,但MadScientist指出,如果不运行source,则不可能实现。我想我只能编写一个Shell脚本来为我完成这个任务。 - user2662833
你需要一个shell的函数来创建shell的函数,而不是一个shell的脚本来创建别名。学会使用函数并避免使用别名;后者非常有限且不太灵活。 - tripleee
太棒了,我会认真研究的 :) 感谢你的指引! - user2662833
1个回答

6
如果您要求的是创建别名并在shell提示符下调用别名,类似于以下内容:make aliases
$ make aliases
$ useful

那是不可能的,原因与make无关。在UNIX/POSIX系统中,进程层次结构是严格的:一个进程启动一个或多个子进程,每个子进程又可以启动更多进程,以此类推。因此,登录管理器进程启动您的shell(或窗口管理器),您的shell启动make,这是另一个进程,make将作为子进程运行另一个shell来运行每个recipe,每个shell将运行像编译器一样的程序,像rm这样的命令也是进程等等。
所有进程的基本规则是它们不能修改其父进程的环境(内存)(并且它们只能在启动子进程之前修改其子进程的环境)。因此,如果您启动一个新的shell并更改您的工作目录,然后退出该shell,则父shell不会更改。如果您在子进程中设置环境变量,则该变量不会在父进程中设置。等等。
Shell别名是特定shell的内存的一部分。因此,您启动的程序无法在其父shell中创建别名。无论该程序是make还是其他任何东西都没有关系。
这就是为什么您必须使用特殊命令source将它们加载到您的shell中:而不是运行新的shell,source命令告诉当前shell运行脚本中的命令,就好像您在命令行中键入它们一样......因此不会创建新进程,并且当前shell的环境和内存被修改。如果通过aliases而不是source aliases以shell脚本的形式运行aliases文件,则将创建一个新shell,定义别名,然后退出shell,所有别名将再次消失。
因此,总之,make无法在调用它的shell中定义别名:操作系统不允许这样做。

太棒了,非常感谢!所以你建议只使用源代码对吧?我也有这个担心,但是你的回答真的让我明白了。再次感谢 :) - user2662833
你可以使用 source(或者它更便携的对应符号 ., 如 . aliases),或者修改你的 shell 配置文件(~/.bashrc 或类似的... 具体取决于你使用哪种 shell)来设置别名,但这样它们将始终在所有 shell 中定义。或者你可以编写一个 shell 函数来源化别名文件,例如 mkaliases() { source aliases; }。基本上这些是你唯一的选择。 - MadScientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接