【问题标题】:Makefile to add shell aliasesMakefile 添加 shell 别名
【发布时间】:2018-06-20 02:10:59
【问题描述】:

我已经在使用 makefile,我希望能够使用它来存储一些有用的别名,然后用户可以调用这些别名。我知道我可以使用已经内置的别名制作一个 bash 文件,然后使用源代码运行它,这样我就可以执行以下操作:

# 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 有什么问题?
  • 我希望这可以作为我构建过程的一部分。因此,如果用户调用make development,它将运行开始开发所需的各种任务。将这些别名添加为他们的开发环境的前置步骤会很好。我也只是不希望文件混乱,因为我有一些这样的用例,所以最好有一个文件来处理它。
  • 你想要aliases 而不是recipes 对吧?通常aliases 通过系统范围的 shell 设置或通过用户配置文件或运行控制文件(例如~/.bashrc)在每个用户的基础上处理。这是必要的,因为它们会影响 shell 环境,无论是通过后续脚本还是 makefile,都不会影响父级环境(例如用户的 shell)。登录后设置其他别名的唯一方法是在命令行中输入source,否则别名只会出现在特定的子shell中。所以有点不清楚你想要什么。
  • 是的,我确实想向父 shell 添加命令,MadScientist 指出,如果不运行源代码,这是不可能的。我想我只需要编写一个 shell 脚本来为我执行此操作。
  • 你想要一个 shell function 来创建 shell functions,而不是 shell script 来创建 aliases。 学会拥抱函数并避免别名;后者非常有限,通用性较差。

标签: bash makefile sh


【解决方案1】:

如果您要求 make aliases 创建别名,然后您可以在 shell 提示符下调用,例如:

$ make aliases
$ useful

那是不可能的,原因与make无关。

在 UNIX/POSIX 系统中,进程层次结构是严格的:一个进程启动一个或多个子进程,每个子进程都可以启动更多,等等。所以登录管理器进程启动你的 shell(或你的窗口管理器),您的 shell 启动 make,这是另一个进程,make 将运行另一个 shell 作为子进程来运行每个配方,并且每个 shell 将运行编译器之类的程序、rm 之类的命令,它们也是进程等。

所有进程的基本规则是不能修改父进程的环境(内存)(只能在子进程启动前修改子进程的环境)。因此,如果您启动一个新的 shell 并更改您的工作目录然后退出该 shell,则父的 shell 不会更改。如果在子进程中设置环境变量,则不会在父进程中设置该变量。等等。

Shell 别名是特定 Shell 内存的一部分。因此,您启动的程序无法在其父 shell 中创建别名。该程序是make 还是其他任何东西都没有关系。

这就是为什么你必须使用特殊命令 source 将它们加载到你的 shell 中:source 命令告诉当前 shell 运行脚本中的命令,就像你要在命令行中输入它们...因此不会创建新进程,并且会修改当前 shell 的环境和内存。如果您将aliases 文件作为shell 脚本运行,通过aliases 而不是source aliases,那么将创建一个新的shell,定义别名,然后shell 将退出并且所有别名将再次消失.

也就是说,make 不可能在调用它的 shell 中定义别名:操作系统不允许这样做。

【讨论】:

  • 太棒了,谢谢!所以你会建议源是去这里的唯一方法吗?我也很害怕,但是这个答案确实为我澄清了一些事情。再次感谢:)
  • 你可以使用source(或者更便携的对应.,如. aliases),或者你可以修改你的shell的配置文件(~/.bashrc或类似的...细节取决于在哪个 shell 上使用)来设置别名,但当然它们总是在所有 shell 中定义。或者您可以编写一个 shell 函数来获取别名文件,例如 mkaliases() { source aliases; }。这些基本上是你唯一的选择。
猜你喜欢
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多