通过ant执行Shell脚本

时间:2013-06-24 05:45:49

标签: unix ant

我有一个名为Call.sh的shell脚本,它在内部调用其他脚本(即.sh),对我来说工作正常。现在我想从 ant 实用程序执行Call.sh。我创建了一个调用.sh的build.xml。但是其中一个脚本要求输入,但是由于进一步的操作失败,ant没有给我机会给出输入。请找到以下代码

在build.xml

<project name="Sample" default="info">
<target name="info">
<exec executable="/bin/bash">
<arg value="/full path/Call.sh"/>
<arg value="/tmp"/>
</exec>
</target>
</project>

Call.sh

    #!/bin/bash
    echo "Begining the execution......"
    sleep 1
    sh ./input.sh
    sh ./AutomateCom.sh
    sh ./Clean.sh
    echo "*****_______*****_______"

input.sh

    #!/bin/bash

    echo "enter the Organization name"
    read Orgname
    echo "Orgname is : $Orgname"
    sed "s/000/$Orgname/g" Final.sql >> ExecuteID.sql
    echo "Organization name has been replaced with $Orgname"

当我运行蚂蚁时:它不断运行....下面是我说蚂蚁时的o / p

[root@krog2-rhel5-64 Work]# ant
Buildfile: /root/test/Work/build.xml

info:
     [exec] enter the Organization name
     [exec] Orgname is :
     [exec] Organization name has been replaced with

BUILD SUCCESSFUL
Total time: 0 seconds
......................................

当我跑./input.sh时我的期望是什么,同样蚂蚁应该问我输入

[root@krog2-rhel5-64 Work]# ./input.sh
enter the Organization name
**yak**
Orgname is : yak
Organization name has been replaced with yak
  However ant doesn't give me opportunity to prompt for the user input. Any suggestions.

3 个答案:

答案 0 :(得分:20)

尝试在ant目标中指定脚本的完整路径:

<target name="test">
  <exec executable="/bin/bash">
    <arg value="/complete/path/to/input.sh"/>
    <arg value="/tmp"/>
  </exec>
</target>

这相当于在shell中发出以下命令:

/bin/bash /complete/path/to/input.sh /tmp

<arg value="..."/>表示一个论点。所以你有/bin/bash的2个参数,脚本和路径的路径。 /tmp。如果您的脚本没有使用传递给bin/bash的额外参数,那么这些参数将被忽略。

如果您的脚本input.sh位于/tmp,您可以说

  <exec executable="/bin/bash">
    <arg value="/tmp/input.sh"/>
  </exec>

  <exec dir="/tmp" executable="/bin/bash">
    <arg value="input.sh"/>
  </exec>

答案 1 :(得分:7)

我知道你已经回答了你的问题,并继续前进。但是我想为后代指出一些事情。你为什么用蚂蚁?看起来你只需要一个shell脚本就可以了。

不要执行bash脚本。您没有列出所有脚本的内容,但是call.shinput.sh在ant中本地执行是微不足道的。这将使您的构建脚本平台独立,并整合日志记录。 您可以使用input任务

直接从ant处理输入
<input
    message="Please enter organization name:"
    addproperty="org.name"
/>

但是我强烈建议您不要有等待用户输入的构建脚本。您可以将org.name设为属性,然后在构建时在命令行中指定它:ant -Dorg.name=yak

你不需要在sql文件上执行find替换,你可以在sql中使用变量并在执行时传入它们。 (实现将依赖于db)

你的例子来自root shell,这也伤害了我的灵魂。不要以root身份登录。

答案 2 :(得分:0)

我的想法是在其中生成 javadoc Netbeans使用它&#34; 运行目标 - &gt;默认&#34; ant脚本,然后用相同的ant脚本(甚至另一个-xml)上传到服务器。

实际上主要目标应该是生成一个javadoc并同时将整个文件夹上传到远程!!!我使用 macOS 10.12.4 作为客户端, Ubuntu 16.04 作为目标。

我从下面尝试了一切:

  • scp 因为没有凭据而无法正常工作
  • ftp mput 无法递归上传所有文件夹。
  • ncftpput不会被蚂蚁脚本
  • 接受

然后我决定分裂成逻辑过程。

需要:

  1. brew install expect
  2. 需要通过遥控器上的ssh登录passwordless
  3. <强> ftp.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="ASMEMU" default="all" basedir="/bin" >
    <target name="ftp">
    
        <exec dir="/Users/macos/NetBeansBash" executable="/bin/bash">
            <arg value="asmemu_mkdir.sh" />
            <arg value="ASMEMU" />
        </exec>
    
        <exec dir="/Users/macos/NetBeansBash" executable="/bin/bash">
            <arg value="asmemu_upload_zip.sh" />
            <arg value="ASMEMU" />
        </exec>
    
        <exec dir="/Users/macos/NetBeansBash" executable="/bin/bash">
            <arg value="asmemu_unzip.sh" />
            <arg value="ASMEMU" />
        </exec>
    
    </target>
    </project>
    

    <强> asmemu_mkdir.sh

    #!/bin/bash
    uhost="example.de"
    uname="usernameusername"
    upass="pwdpwd"
    remote=/httpdocs/destination1/destination2
    pwd
    ftp -in <<EOF
    open $uhost
    user $uname $upass
    cd $remote
    mkdir $1
    close
    bye
    EOF
    

    <强> asmemu_upload_zip.sh

    #!/bin/bash
    uhost="example.de"
    uname="usernameusername"
    upass="pwdpwd"
    remote=/httpdocs/th/ra
    cd /Users/macos/NetBeansProjects/$1/dist/
    pwd
    ftp -in <<EOF
    open $uhost
    user $uname $upass
    cd $remote/$1
    mput javadoc.zip
    close
    bye
    EOF
    

    <强> asmemu_unzip.sh

    ssh username@example.de /bin/bash <<EOT
    cd /var/www/vhosts/example.de/httpdocs/th/ra/$1
    unzip javadoc.zip
    rm javadoc.zip
    EOT
    

    多数民众赞成。 Justt右键单击 ftp.xml &#34; 运行目标 - &gt; 其他目标 - &gt;的 FTP &#34;并将javadoc.zip上传并解压缩到那里。

    当然你需要在开始之前创建javadoc.zip。可以在整个段落中构建 build.xml

    为我工作100%=)