我该如何转发#!通过 bash 脚本提供间接

我该如何转发#!通过 bash 脚本提供间接

抱歉,如果问题陈述不太清楚。

我想要一个 bash 脚本,我可以编辑它来更改许多其他脚本的行为。

例如——我有一些很棒的脚本。它们可以使用 groovy 解释器“groovy”运行,也可以使用名为“groovyclient”的特殊运行程序运行。我可能想更改哪个运行它(或者做一些完全不同的事情,比如将它们编译成 Java 类文件并使用 Java 运行它们)

因此,如果我有一个间接脚本:/home/me/groovy/groovyrun,这是一个 shell 脚本,它可能如下所示:

/usr/bin/groovy %*

或者像这样:

/home/me/groovy/groovyclient $*

我尝试了#!原始脚本上的行如下所示:

#!/home/me/groovy/groovyrun

并很快意识到 bash 没有被调用,所以它不知道如何处理 groovyrun

然后我尝试:

#!/bin/bash /home/me/groovy/groovyrun

但现在我认为 $*

这应该运行它,但我相信它在获取原始参数列表时存在问题(被调用脚本中的 $* 可能是错误的)。

现在我对如何做到这一点相当迷茫,我认为这可能是一种常见的模式,我只是对 Linux 不够熟悉,无法了解它(甚至不知道如何找到它),所以我问。

如果我放弃 #! 我可以轻松解决它干脆直接将 groovy 脚本传递给 shell 脚本,但这有什么乐趣呢?

答案1

如果我理解正确的话,您想要创建一个间接级别,其中您通过舍邦in a script 本身就是一个带有 shebang 的脚本。Linux 接受嵌套 shebang,但其他 Unix 变体不接受。所以你可以把

#!/home/me/groovy/groovyrun

在 Groovy 脚本的顶部

#!/bin/sh

在顶端/home/me/groovy/groovyrun

要执行groovyclientgroovy从包装器脚本中执行,请使用类似

#!/bin/sh
if …; then
  exec groovyclient "$@"
else
  exec groovy "$@"
fi

"$@"代表传递给脚本的参数列表,完全按原样复制(正确保留参数中的空格等)。不要使用$*,它将参数与中间的空格连接起来(这样groovyrun 'foo bar'会退化为groovyrun 'foo' 'bar'),并且永远不要让变量扩展不带引号。关于exec,请参阅包装脚本中 exec 的原因

答案2

如果您在脚本中指定 shebang,它应该可以工作groovyrun

作为一个快速实验,创建shell1包含

#!/bin/sh
echo shell1: "$@"
sh "$@"

shell2含有

#!/.../shell1
echo shell2: "$@"

(具有正确的路径shell1);运行shell2 Hello然后产生

shell1: ./shell2 Hello
shell2: Hello

正如您所看到的,传递给每个脚本的参数在这两种情况下看起来都是正确的。

相关内容