通过ant执行Shell脚本



我有一个名为Call.sh的shell脚本,它在内部调用其他脚本(即.sh),对我来说运行良好。现在我想从ant实用程序执行Call.sh。我已经制作了一个build.xml,它调用.sh。但其中一个脚本要求输入,但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>

呼叫.sh

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

输入.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.

尝试在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有两个参数,脚本的路径&/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>

我知道你的问题已经得到了回答,并继续前进。然而,我想为子孙后代指出一些事情。你为什么用蚂蚁?看来你最好只写一个shell脚本。

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

<input
    message="Please enter organization name:"
    addproperty="org.name"
/>

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

您不需要在sql文件上进行查找-替换,您可以在sql中使用变量,并在执行时将其传入。(实现将依赖于数据库)

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

我的想法是在Netbeans使用它的"Run target->default"ant脚本,然后使用相同的ant脚本(甚至另一个xml)上传到服务器。

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

我尝试了下面的一切:

  • scp工作不太好,因为没有凭据
  • ftp与它的mput不能递归上传所有文件夹
  • 不会接受ant脚本中的ncftpput

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

要求:

  1. brew安装期望
  2. 需要在远程设备上通过ssh无密码登录

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>

asmemo_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

asmem_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

asmemuunzip.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"运行目标->其他目标ftp",javadoc.zip将在那里上传和解压缩。

当然,在开始之前您需要创建javadoc.zip。可以在整个文章中构建build.xml

为我工作100%=)

相关内容

  • 没有找到相关文章

最新更新