1

以下几乎可以工作:

#!/bin/bash
/* 2>&1 >/dev/null
script_dir=$(dirname "$0")

export GROOVY_HOME=${script_dir}/../../../../Tools/groovy/groovy-2.0.2

exec ${GROOVY_HOME}/bin/groovy -cp "${script_dir}:$(ls ${script_dir}/build/lib/runtime/*.jar | xargs echo | sed -e 's| |:|g')" "$0"
*/ // 2>&1 >/dev/null

println("aoeu")

唯一的问题是 shell glob /* 并尝试执行它。最后,我真正想做的就是能够构建 Groovy 脚本的类路径,而不必拥有两个单独的脚本。

4

3 回答 3

1

您也可以尝试下面的技术,它独立于 Groovy 语法(并且通常不会在 上产生输出stderr):

#!/bin/sh
script_dir=$(dirname "$0")
export GROOVY_HOME="$script_dir/../../../../Tools/groovy/groovy-2.0.2"

awk 'mark_on{print}/^__END__$/{mark_on=1}' "$0" >/tmp/$$.groovy

"$GROOVY_HOME/bin/groovy" -cp "$script_dir:$(echo "$script_dir"/build/lib/runtime/*.jar | tr " " :)" /tmp/$$.groovy
status=$?

rm -f /tmp/$$.groovy

exit $status

__END__

println("aoeu")

还要注意类路径计算的简化;请记住,通配符(通配符扩展)是由 shell 执行的,而不是由接受参数的命令执行的,因此在这种情况下您不必(也不想)使用ls


在这种情况下,原始代码中的大括号${}在技术上是多余的(它们纯粹是风格);例如,如果您必须在变量替换之后直接附加一个字符串,其中变量名称和后面的内容之间没有明确的分隔符,则需要它们,例如,您不能说但$my_varsome_string您可以写${my_var}some_string, 或任何$my_var"some_string"or$my_var'some_string'"$my_var"some_stringor "$my_var""some_string"。我出于“简约”的目的移除了大括号,为了说明上述内容,但同样,出于文体原因保留它们是完全可以的。

我在上面的代码中一致添加的引号可以保护您免受潜在的空白和某些其他特殊字符的影响$GROOVY_HOME$GROOVY_HOME如果您知道不包含空格,请随意删除它们以简化引用(并保持简约) 。

于 2012-11-09T01:31:34.503 回答
0

看来你想写一个 groovy / shell polyglot。

我不知道 groovy,但从文档看来 [] 是一个有效的 groovy 命令,创建一个空列表。

然后你可以这样写:

#!/bin/bash
[ /*  2> /dev/null > /dev/null
script_dir=$(dirname "$0")

export GROOVY_HOME=${script_dir}/../../../../Tools/groovy/groovy-2.0.2

exec ${GROOVY_HOME}/bin/groovy -cp "${script_dir}:$(ls ${script_dir}/build/lib/runtime/*.jar | xargs echo | sed -e 's| |:|g')" "$0"
*/
    ]

println("aoeu")

Groovy 会读取 [] 并忽略它,而 bash 会使用 /* 调用 [,这将导致错误被忽略。但它不会运行任何意外程序。

于 2012-11-09T01:39:39.770 回答
0
#!/bin/bash
script_dir="$(cd $(dirname $0) >/dev/null; pwd -P)"

function after-bangshe() {
  sed -e '1,/^!#$/d' "$1"
}

if [ -z "${GROOVY_HOME}" ]
then
  echo 'GROOVY_HOME must be defined.' >&2
  exit 1
fi

CLASSPATH="${script_dir}" "${GROOVY_HOME}/bin/groovy" -e "$(after-bangshe $0)" "$@"
exit
!#
println 'aoeu'

的输出cd被重定向到/dev/null以防万一CDPATH设置(这会产生cd噪音)。

CLASSPATH设置为脚本目录,以便可以找到任何支持类。

sed命令会删除该行之后的所有内容!#

于 2015-08-30T17:56:45.060 回答