免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 492 | 回复: 5

[其他] eval 执行命令的一些问题 [复制链接]

招聘 : 质量管理
论坛徽章:
0
发表于 2019-09-09 11:41 |显示全部楼层
本帖最后由 blueskysee 于 2019-09-12 10:22 编辑

最近写一个脚本,为了更方便的查看log, 写了一个函数
runcmd()
{
        echo -e "${Green}Run command:### {$*} ###${Res}"
       eval $*
        res=$?
        if [ $res -ne 0 ];then
                echo -e "${Red}>>>Failed command:{$*}${Res}"
                echo "`date`*" >> $logFile
        fi
}

发现有管道,或者有双引号的执行不了。
Env()
{
        echo "setEnv: =========Configure the VM ++$1++ Env to /home/hadoop/.bashrc ============"
        runcmd multipass exec $1 -- sh -c "echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' |sudo tee -a $hadoopUserPath/.bashrc"
        runcmd multipass exec $1 -- sh -c "echo 'export JAVA_BIN=/usr/lib/jvm/java-8-openjdk-amd64/bin' |sudo tee -a $hadoopUserPath/.bashrc"
        runcmd multipass exec $1 -- sh -c "echo 'export JRE_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre' |sudo tee -a $hadoopUserPath/.bashrc"
        runcmd multipass exec $1 -- sh -c "echo 'export HADOOP_PATH=/usr/local/hadoop' |sudo tee -a $hadoopUserPath/.bashrc"
        runcmd multipass exec $1 -- sh -c 'echo "export PATH=\$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin" |sudo tee -a $hadoopUserPath/.bashrc'
        runcmd multipass exec $1 -- sh -c "echo 'export CLASSPATH=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib:/usr/lib/jvm/java-8-openjdk-amd64/lib:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/charsets.jar' |sudo tee -a $hadoopUserPath/.bashrc"

        runcmd multipass exec $1 -- sh -c "echo 'export STREAM_JAR_PATH=/usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.6.1.jar' |sudo tee -a $hadoopUserPath/.bashrc"
        runcmd multipass exec $1 -- sh -c "echo 'export HIVE_HOME=/usr/local/apache-hive-1.2.2-bin' |sudo tee -a $hadoopUserPath/.bashrc"
        #multipass exec $1 -- sh -c "echo 'export PATH=$HIVE_HOME/binPATH ' |sudo tee -a $hadoopUserPath/.bashrc"
        runcmd multipass exec $1 -- sh -c 'echo "export PATH=\$HIVE_HOME/bin:\$PATH"|sudo tee -a $hadoopUserPath/.bashrc'
}
....

runcmd multipass exec $1 -- sh -c "sudo useradd -m $hadoopUserName -s /bin/bash"
runcmd multipass exec $1 -- sudo su - hadoop -c 'ssh-keygen -t rsa'
runcmd multipass exec $1 -- sudo cat $hadoopUserPath/.ssh/id_rsa.pub >>$tmpDir/authorized_keys
               

查了许多资料,无法解决我的问题,各位大神帮忙看下。




论坛徽章:
18
发表于 2019-09-09 14:47 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
22
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:46
发表于 2019-09-10 18:05 |显示全部楼层
双引号转义

招聘 : 质量管理
论坛徽章:
0
发表于 2019-09-11 17:20 |显示全部楼层
回复 3# chengchow

我试了下,双引号转义不行。

论坛徽章:
0
发表于 2019-09-12 14:12 |显示全部楼层
powershell 应该可以,建议试试。

下列命令,centos7 测试通过,
  1. function runcmd($in)
  2. {
  3.     write-host "$in" -ForegroundColor Green
  4.     Invoke-Expression -Command $in
  5.     if ($LASTEXITCODE -ne 0)
  6.         {
  7.             write-host "$in >>>Failed" -ForegroundColor red
  8.                 set-content -LiteralPath  $logFile -Value (Get-Date)
  9.         }
  10. }

  11. $cmd =
  12. @'
  13. find / -name sshd_config | xargs grep "system"
  14. '@

  15. runcmd -in $cmd

复制代码


若需要传值,则用双引号,即
$cmd =
@"
xxx
"@

招聘 : 质量管理
论坛徽章:
0
发表于 2019-09-12 17:09 |显示全部楼层
回复 5# 本友会机友会摄友会

多谢,我用的是Ubuntu19.04, 测试还是通不过,我在研究下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP