我有一个名为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.
答案 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.sh
和input.sh
在ant中本地执行是微不足道的。这将使您的构建脚本平台独立,并整合日志记录。
您可以使用input任务
<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 作为目标。
我从下面尝试了一切:
然后我决定分裂成逻辑过程。
需要:
<强> 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%=)