我想只在特定文件夹中运行特定应用程序。例如,对于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 …
不会解释第一个看起来像命令的参数后的选项(此处:sh
或vint
)。请参阅已经链接答案我指出sudo
并su
在此主题上采取了不同的做法。希望docker exec
与 类似sudo
。本文档让我相信如此。
启动后docker
,shell 似乎不再需要解释脚本。它不用运行命令并等待,而是可以用命令替换自身;使用exec
:
exec docker …
为此你不需要bash
,sh
应该启动得更快:
#!/usr/bin/env sh
exec docker exec -i vim-plugin vint "$@"
现在你的方法./.bin
应该PATH
可以工作了。添加仍然./.bin
有缺陷,因为添加.
PATH
。更好的方法是为包装器脚本创建一个目录,将其绝对路径添加到PATH
作为第一个条目,并在vint
那里放置一个包装器。包装器可以测试它$PWD
(使用if
、elif
;或使用case
)并采取相应行动。编写任何您想要的逻辑。结果可能是您将能够以bash
比更简单的方式实现所需的逻辑sh
;所以您可能更喜欢bash
在shebang中。