抱歉,如果问题陈述不太清楚。
我想要一个 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
。
要执行groovyclient
或groovy
从包装器脚本中执行,请使用类似
#!/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
正如您所看到的,传递给每个脚本的参数在这两种情况下看起来都是正确的。