覆盖特定文件夹中应用程序/命令的调用

覆盖特定文件夹中应用程序/命令的调用

我想只在特定文件夹中运行特定应用程序。例如,对于vint应用程序

$ cd /workspace/vim-plugin
$ vint ftplugin/terraform.vim 

docker exec -i vim-plugin sh -c "vint ftplugin/terraform.vim"应该在其他文件夹中运行vint应该意味着不同的东西甚至是“未找到命令”。

我现在使用的解决方案是direnv将 ./.bin 文件夹添加到 PATH 并在该文件夹中生成 shell 脚本,该脚本将覆盖或增加运行特定应用程序的可能性。在上面的示例中,它将是 /workspace/vim-plugin/.bin/vint,其简化版本如下所示:

#!/usr/bin/env bash

docker exec -i vim-plugin sh -c "vint $@"

它或多或少按照预期工作,但是在生成此脚本以及解析脚本参数(单引号或双引号参数)时存在一些烦恼。

我的问题是,您是否有不同的想法如何在 Gnu/Linux 环境、shell bash/zsh 中解决此问题?当您有一个应用程序并只需链接到它时,也许可以使用 BusyBox 解决方案?

答案1

“解析脚本参数(单引号或双引号参数)”的烦恼是因为您没有$@以正确的方式传递。这是您的方式:

docker exec -i vim-plugin sh -c "vint $@"

解释脚本的 shell 会扩展双引号$@,事情会变得混乱。请参阅分析和以下内容我的其他答案。问题非常相似。改进后的代码:

docker exec -i vim-plugin sh -c 'exec vint "$@"' -- vint-sh "$@"

我不知道docker 根本,但既然它可以运行sh -c …那么它可能也可以运行vint … 直接地sh。如果是这样,那么首先就没有理由。代码变为:

docker exec -i vim-plugin vint "$@"

希望docker exec …不会解释第一个看起来像命令的参数后的选项(此处:shvint)。请参阅已经链接答案我指出sudosu在此主题上采取了不同的做法。希望docker exec与 类似sudo本文档让我相信如此。

启动后docker,shell 似乎不再需要解释脚本。它不用运行命令并等待,而是可以用命令替换自身;使用exec

exec docker …

为此你不需要bashsh应该启动得更快:

#!/usr/bin/env sh
exec docker exec -i vim-plugin vint "$@"

现在你的方法./.bin应该PATH可以工作了。添加仍然./.bin有缺陷,因为添加.PATH。更好的方法是为包装器脚本创建一个目录,将其绝对路径添加到PATH作为第一个条目,并在vint那里放置一个包装器。包装器可以测试它$PWD(使用ifelif;或使用case)并采取相应行动。编写任何您想要的逻辑。结果可能是您将能够以bash比更简单的方式实现所需的逻辑sh;所以您可能更喜欢bash在shebang中。

相关内容