12

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

构建.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 时,我期望什么,以同样的方式 ant 应该要求我输入

[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.
4

3 回答 3

23

尝试在 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="..."/>表示一个论点。所以你有 2 个参数/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>
于 2013-06-24T06:20:09.070 回答
9

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

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

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

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

您不需要对sql文件进行查找替换,您可以在sql中使用变量并在执行时将它们传递进去。(实现将取决于数据库)

您的示例来自根外壳,这也伤害了我的灵魂。不要以root身份登录。

于 2013-09-19T16:55:58.850 回答
0

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

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

我尝试了以下所有内容:

  • scp不能很好地工作,因为没有凭据
  • 带有mput的ftp不能递归地上传所有文件夹。
  • nt 脚本不接受 ncftpput

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

要求:

  1. 酿造安装期望
  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>

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

就是这样。只需右键单击ftp.xml运行目标->其他目标-> ftp ”,javadoc.zip 就会被上传并解压到那里。

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

为我工作 100% =)

于 2017-05-15T10:50:32.200 回答