临时别名 cmd 以压缩现有命令,然后在脚本退出时过期

Temporary alias a cmd to squash an existing command, then expire upon script exit

假设命令 bam 在我的系统上。我们将其称为 bam1。
假设我的系统上有另一个版本的 bam 二进制文件(bam2,尽管它的名称可能大不相同)。

当我 运行 some-script 时,我希望在该脚本(和所有子进程)中对 bam 的所有调用都使用 bam2。否则他们将使用 bam1,因为默认情况下 bam1 在该环境的 $PATH 中。

假设我有可用的 bam2 的完整路径。
假设 bam 可能 运行 个 调用 bam
的子进程 假设如果出现任何问题,bam 必须 恢复到 bam1。
假设现在是 unix-ish 系统,但 Windows 支持 welcome。

$ alias bam="bam2" && bam # <== doesn't quite work. see ls test below
$ alias bam="ls" && ls # <== "-bash: bam: command not found"

我需要暂时用另一个应用程序二进制指针覆盖。使用目的是针对 nodejs 应用程序,所以我可以在那里做一些在节点上下文中执行更好的 x 平台的东西会很棒。

我考虑过创建一个 tmp 符号链接并将其文件夹添加到系统 PATH 中,但我觉得可能有更简单的方法。

有什么建议吗?

您可以创建一个临时目录

 tmpdir=`mktemp -d`

将其标记为在退出时移除

 trap 'rm -rf "$tmpdir"' exit

将其添加到您的路径中:

 PATH="$tmpdir:$PATH" #<= This is the key part

然后在 $tmpdir

中放置一个以您的覆盖命名的 link
 ln -s "$(which bam2)" "$tmpdir"/bam

你从这里产生的任何进程都将继承 PATH 变量(它是一个环境(=exported)变量),如果他们试图搜索可执行文件,你的临时目录是他们首先搜索的.

如果您担心安全问题,您会希望将其设为(可能是永久的)只读目录,而不是临时的可写目录。