【问题标题】:Command works in interactive shell but not shell script命令在交互式 shell 中有效,但在 shell 脚本中无效
【发布时间】:2012-09-10 22:03:51
【问题描述】:

我编写了一个脚本,它会为 javac 生成适当的参数来编译我的项目,以便更加精通 shell 脚本。

这很奇怪.. 脚本运行良好,但如果脚本使用这些参数运行 javac,则它不起作用,如果我在交互式 shell 中运行 exact 相同的命令,它会运行.一切都是用绝对路径输出的,所以我在这里几乎不知所措。

示例目录结构:

src/File.java
src/File.png
src/dir/File2.java
jars/Library.jar

预期输出:

build/File.class
build/File.png
build/dir/File2.class

shell脚本:

#! /bin/sh

cwd=$(pwd)

if [ -d "build" ]; then
    rm -rf $cwd/build/*
else
    mkdir $cwd/build
fi

find $cwd/src \( ! -path '*/.*' \) -type f ! -iname "*.java" | xargs -I{} cp --parents {} $cwd/build

cmd=$(echo javac -sourcepath $cwd/src -classpath $(find $cwd/jars -type f | awk '{ printf("\"%s\";", $0);}'  | awk '{ print substr($0, 0, length($0)); }') -d $cwd/build $(find $cwd/src \( ! -path '*/.*' \) -type f -iname "*.java"))

$cmd
echo $cmd

命令输出:

javac -sourcepath /home/test/src -classpath "/home/test/jars/Library.jar" -d /home/test/build /home/test/src/File.java /home/test/src/dir/File2.java

我的实际项目太大,无法在此处发布,但基本上会发生大量错误输出,好像类路径设置不正确(它们是库函数上的错误)。如果我从 echo 语句中复制命令,将其粘贴,然后按 Enter 即可完美运行。

我不明白。

有什么想法吗?

【问题讨论】:

    标签: bash shell debian javac


    【解决方案1】:

    一般来说,只要您可以剪切并粘贴命令并使其工作,但外壳程序在运行该命令时无法工作,就会在某处出现引用问题。与其试图弄清楚它是什么,不如让 shell 评估字符串。换句话说,而不是:

    $cmd
    

    您希望 shell 评估 $cmd 就像您直接键入它一样:

    eval $cmd
    

    【讨论】:

      【解决方案2】:

      您在-classpath 的参数周围加上的引号按字面意思处理,因为它们是$cmd 值的一部分。在扩展$cmd 并将结果字符串解析为命令行后,它们不会被删除。就好像你在命令行输入过一样

      $ javac -sourcepath /home/test/src -classpath \"/home/test/jars/Library.jar\" -d /home/test/build /home/test/src/File.java /home/test/src/dir/File2.java
      

      【讨论】:

        猜你喜欢
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 2019-07-30
        • 2012-07-03
        • 1970-01-01
        • 2012-04-02
        相关资源
        最近更新 更多