我已经在使用一个makefile,我希望能够使用它来存储一些有用的别名,然后用户可以调用它们。我知道我可以使用已经内置的别名制作一个bash文件,因此可以使用source运行它,因此我可以执行以下操作:
# File: aliases.sh
alias useful="command to run"
alias also-useful="another command -to run"
然后我可以在当前的终端会话中使用以下命令运行该命令:
source ./aliases.sh
所以我希望通过makefile实现类似的功能,希望有一个简单的aliases
条目,以便用户可以运行:
make aliases
如果可能的话,我宁愿避免添加额外的文件,因为我不想为这样的简单任务添加额外的文件。如果您有任何更好的建议,我也乐于听取。谢谢你。
答案 0 :(得分:2)
如果您要的是make aliases
创建别名,然后可以在shell提示符下调用它,例如:
$ make aliases
$ useful
然后那是不可能的,原因与make
无关。
在UNIX / POSIX系统中,流程层次结构很严格:一个流程启动一个或多个子流程,每个子流程都可以启动更多,依此类推。因此,登录管理器流程启动您的Shell(或窗口管理器),您的shell启动make
,这是另一个过程,make
将运行另一个shell作为子过程来运行每个配方,并且每个shell将运行诸如编译器之类的程序,诸如rm
之类的命令也可以处理等等。
这是所有进程的基本规则,即他们不能修改其父母的环境(内存)(并且只能在其子女开始之前对其子女的环境进行修改)。因此,如果您启动一个新的Shell并更改您的工作目录,然后退出该Shell,则不会更改父级的Shell。如果在子进程中设置环境变量,则不会在父进程中设置该变量。等等
Shell别名是特定Shell内存的一部分。因此,您启动的程序无法在其父外壳中创建别名。该程序是make
还是其他程序都没关系。
这就是为什么必须使用特殊命令source
将它们加载到您的shell中的原因:source
命令告诉当前的shell以如下方式运行脚本中的命令,而不是运行新的shell:如果您在命令行中输入了它们,则不会创建新进程,也不会修改当前shell的环境和内存。如果通过aliases
而不是aliases
将source aliases
文件作为shell脚本运行,则将创建一个新的shell,定义别名,然后退出该shell,并且所有别名会消失。
因此,所有这些make
不可能在调用它的shell中定义别名:操作系统不允许。