我已经在使用 makefile,我希望能够使用它来存储一些用户可以调用的有用别名。我知道我可以使用已经内置的别名创建一个 bash 文件,然后使用源代码运行它,这样我就可以执行以下操作:
# File: aliases.sh
alias useful="command to run"
alias also-useful="another command -to run"
Run Code Online (Sandbox Code Playgroud)
然后我可以在当前终端会话中运行它:
source ./aliases.sh
Run Code Online (Sandbox Code Playgroud)
所以我希望用 makefile 实现类似的东西,我希望有一个简单的aliases条目,这样用户就可以运行:
make aliases
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我宁愿避免添加额外的文件,因为我不想为这样简单的任务添加额外的文件。如果您有任何更好的建议,我也愿意听取他们的意见。
如果您要make aliases创建别名,然后您可以在 shell 提示符下调用这些别名,例如:
$ make aliases
$ useful
Run Code Online (Sandbox Code Playgroud)
那么那是不可能的,原因与此无关make。
在 UNIX/POSIX 系统中,进程层次结构是严格的:一个进程启动一个或多个子进程,每个子进程可以启动更多,等等。所以登录管理器进程启动你的 shell(或你的窗口管理器),你的 shell 启动make,这是另一个进程,make将运行另一个 shell 作为子进程来运行每个配方,每个 shell 将运行诸如编译器之类的程序、rm也是进程的命令等。
不能修改父进程的环境(记忆)是所有进程的基本规则(并且只能在启动之前修改子进程的环境)。因此,如果您启动一个新的 shell 并更改您的工作目录然后退出该 shell,则父级的 shell 不会更改。如果在子进程中设置环境变量,则该变量不会在父进程中设置。等等。
Shell 别名是特定 Shell 内存的一部分。因此,您启动的程序无法在其父 shell 中创建别名。那个程序是make或其他什么都没有关系。
这就是为什么您必须使用特殊命令source将它们加载到您的 shell 中的原因:该source命令不是运行新的 shell,而是告诉当前 shell 运行脚本中的命令,就像您在命令行中输入它们一样。 . 所以不会创建新进程,并且修改当前 shell 的环境和内存。如果您将aliases文件作为 shell 脚本运行,通过aliases而不是source aliases,则将创建一个新的 shell,将定义别名,然后 shell 将退出,所有别名将再次消失。
所以,所有这些都说明make在调用它的 shell 中定义别名是不可能的:操作系统不会允许它。
| 归档时间: |
|
| 查看次数: |
1238 次 |
| 最近记录: |