我有一个名为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.sh
和input.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
然后我决定分成几个逻辑过程。
要求:
- brew安装期望
- 需要在远程设备上通过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%=)