为啥C语言用execl执行bash shell脚本会出现Exec format error

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥C语言用execl执行bash shell脚本会出现Exec format error相关的知识,希望对你有一定的参考价值。

进行linux测试编写脚本必少Shell脚本名称随便定义要缀名例写abcsmartzip类名称运行要键入./smartzip能运行脚本每行命令处用空格行第1部.Linux脚本编写基础1.1语基本介绍1.1.1程序必须面行始(必须文件第行):#!/bin/sh  符号#!用告诉系统面参数用执行该文件程序例我使用/bin/sh执行程序  编辑脚本要执行该脚本必须使其执行  要使脚本执行:编译chmod+xfilename才能用./filename运行1.1.2注释  进行shell编程#句表示注释直行结束我真诚建议您程序使用注释  您使用注释即使相间内没使用该脚本您能短间内明白该脚本作用及工作原理1.1.3变量  其编程语言您必须使用变量shell编程所变量都由字符串组并且您需要变量进行声明要赋值给变量您写:#!/bin/sh#变量赋值:a="helloworld"#现打印变量a内容:echo"Ais:"echo$a候变量名容易与其文字混淆比:num=2echo"thisisthe$numnd"并打印"thisisthe2nd"仅仅打印"thisisthe"shell搜索变量numnd值变量没值使用花括号告诉shell我要打印num变量:num=2echo"thisisthe$numnd"  打印:thisisthe2nd1.1.4环境变量由export关键字处理变量叫做环境变量我环境变量进行讨论通情况仅仅登录脚本使用环境变量1.1.5Shell命令流程控制shell脚本使用三类命令:1)Unix命令:  虽shell脚本使用任意unix命令由些相更用命令些命令通用进行文件文字操作用命令语及功能  echo"sometext":文字内容打印屏幕  ls:文件列表  wc–lfile:计算文件行数wc-wfile:计算文件单词数wc-cfile:计算文件字符数  cpsourcefiledestfile:文件拷贝  mvoldnamenewname:重命名文件或移文件  rmfile:删除文件  grep'pattern'file:文件内搜索字符串比:grep'searchstring'file.txt  cut-bcolnumfile:指定欲显示文件内容范围并输标准输设备比:输每行第5第9字符cut-b5-9file.txt千万要cat命令混淆两完全同命令  catfile.txt:输文件内容标准输设备(屏幕)  filesomefile:文件类型  readvar:提示用户输入并输入赋值给变量  sortfile.txt:file.txt文件行进行排序  uniq:删除文本文件现行列比:sortfile.txt|uniq  expr:进行数运算Example:add2and3expr2"+"3  find:搜索文件比:根据文件名搜索find.-namefilename-print  tee:数据输标准输设备(屏幕)文件比:somecommand|teeoutfile  basenamefile:返包含路径文件名比:basename/bin/tux返tux  dirnamefile:返文件所路径比:dirname/bin/tux返/bin  headfile:打印文本文件几行  tailfile:打印文本文件末尾几行  sed:Sed基本查找替换程序标准输入(比命令管道)读入文本并结输标准输(屏幕)该命令采用则表达式(见参考)进行搜索要shell通配符相混淆比:linuxfocus替换LinuxFocus:cattext.file|sed's/linuxfocus/LinuxFocus/'>newtext.file  awk:awk用文本文件提取字段缺省字段割符空格使用-F指定其割符catfile.txt|awk-F,'print$1","$3'我使用作字段割符同打印第第三字段该文件内容:AdamBor,34,IndiaKerryMiller,22,USA命令输结:AdamBor,IndiaKerryMiller,USA2)概念:管道,重定向backtick  些系统命令真重要  管道(|)命令输作另外命令输入grep"hello"file.txt|wc-l  file.txt搜索包含hello行并计算其行数  grep命令输作wc命令输入您使用命令  重定向:命令结输文件标准输(屏幕)  >写入文件并覆盖旧文件  >>加文件尾部保留旧文件内容反短斜线 使用反短斜线命令输作另外命令命令行参数命令:find.-mtime-1-typef-print  用查找24(-mtime–2则表示48)内修改文件您想所查找文件打包则使用脚本:#!/bin/sh#Theticksarebackticks(`)notnormalquotes('):tar-zcvflastmod.tar.gz`find.-mtime-1-typef-print`3)流程控制1.if  "if"表达式条件真则执行then面部:if.;then .elif.;then .else .fi数情况使用测试命令条件进行测试比比较字符串、判断文件否存及否读等等…  通用"[]"表示条件测试注意空格重要要确保括号空格[-f"somefile"]:判断否文件[-x"/bin/ls"]:判断/bin/ls否存并执行权限[-n"$var"]:判断$var变量否值["$a"="$b"]:判断$a$b否相等  执行mantest查看所测试表达式比较判断类型  直接执行脚本:#!/bin/shif["$SHELL"="/bin/bash"];then echo"yourloginshellisthebash(bourneagainshell)"else echo"yourloginshellisnotbashbut$SHELL"fi  变量$SHELL包含登录shell名称我/bin/bash进行比较快捷操作符熟悉C语言朋友能喜欢面表达式:[-f"/etc/shadow"]&&echo"Thiscomputerusesshadowpasswors"  &&快捷操作符左边表达式真则执行右边语句您认逻辑运算与操作例表示/etc/shadow文件存则打印Thiscomputerusesshadowpasswors同或操作(||)shell编程用例:#!/bin/shmailfolder=/var/spool/mail/james[-r"$mailfolder"]''echo"Cannotread$mailfolder";exit1;echo"$mailfolderhasmailfrom:"grep"^From"$mailfolder该脚本首先判断mailfolder否读读则打印该文件"From"行读则或操作效打印错误信息脚本退问题我必须两命令:  -打印错误信息  -退程序  我使用花括号匿名函数形式两命令放起作命令使用般函数文提及  用与或操作符我用if表达式作任何事情使用与或操作符更便利2.casecase:表达式用匹配给定字符串数字casein)dosomethinghere;;esac  让我看例file命令辨别给定文件文件类型比:filelf.gz  返:lf.gz:gzipcompresseddata,deflated,originalfilename,lastmodified:MonAug2723:09:182001,os:Unix 我利用点写叫做smartzip脚本该脚本自解压bzip2,gzipzip类型压缩文件:#!/bin/shftype=`file"$1"`case"$ftype"in"$1:Ziparchive"*)  unzip"$1";;"$1:gzipcompressed"*)  gunzip"$1";;"$1:bzip2compressed"*)  bunzip2"$1";;*)echo"File$1cannotbeuncompressedwithsmartzip";;esac  您能注意我使用特殊变量$1该变量包含传递给该程序第参数值说我运行:smartziparticles.zip$1字符串articles.zip3.selsectselect表达式种bash扩展应用尤其擅于交互式使用用户组同值进行选择selectvarin;do breakdone.now$varcanbeused.面例:#!/bin/shecho"WhatisyourfavouriteOS?"selectvarin"Linux""GnuHurd""FreeBSD""Other";do    breakdoneecho"Youhaveselected$var"  面该脚本运行结:WhatisyourfavouriteOS?1)Linux2)GnuHurd3)FreeBSD4)Other#?1YouhaveselectedLinux4.looploop表达式:while;do.done  while-loop运行直表达式测试真willrunwhiletheexpressionthatwetestforistrue.关键字"break"用跳循环关键字continue用执行余部直接跳循环  for-loop表达式查看字符串列表(字符串用空格隔)其赋给变量:forvarin.;do .done面例别打印ABC屏幕:#!/bin/shforvarinABC;do echo"varis$var"done面更用脚本showrpm其功能打印些RPM包统计信息:#!/bin/sh#listacontentsummaryofanumberofRPMpackages#USAGE:showrpmrpmfile1rpmfile2#EXAMPLE:showrpm/cdrom/RedHat/RPMS/*.rpmforrpmpackagein$*;do if[-r"$rpmpackage"];then  echo"===============$rpmpackage=============="  rpm-qi-p$rpmpackage else  echo"ERROR:cannotreadfile$rpmpackage" fidone  现第二特殊变量$*该变量包含所输入命令行参数值您运行showrpmopenssh.rpmw3m.rpmwebgrep.rpm$*包含3字符串即openssh.rpm,w3m.rpmandwebgrep.rpm.5.引号向程序传递任何参数前程序扩展通配符变量所谓扩展意思程序通配符(比*)替换合适文件名变量替换变量值防止程序作种替换您使用引号:让我看例假设前目录些文件两jpg文件mail.jpgtux.jpg1.2编译SHELL脚本#ch#!/bin/shmod+xfilename cho*.jpg∪缓螅梢酝ü淙耄?./filename执行您脚本  打印"mail.jpgtux.jpg"结   引号(单引号双引号)防止种通配符扩展:#!/bin/shecho"*.jpg"echo'*.jpg'  打印"*.jpg"两  单引号更严格些防止任何变量扩展双引号防止通配符扩展允许变量扩展#!/bin/shecho$SHELLecho"$SHELL"echo'$SHELL'  运行结:/bin/bash/bin/bash$SHELL  种防止种扩展使用转义字符——反斜杆:echo/*.jpgecho/$SHELL  输:*.jpg$SHELL6.Heredocuments要几行文字传递给命令heredocuments(译者注:目前没见该词适合翻译)种错每脚本写段帮助性文字用我四heredocuments必用echo函数行行输"Heredocument"heredocument段特殊目代码块.使用I/O重定向形式命令序列传递交互程序或者命令,比ftp,cat,或者ex文本编辑器.1COMMANDlimitstring用划定命令序列范围(译者注:两相同limitstring间命令序列).特殊符号heredocument形式看:1#!/bin/bash2interactive-program选择名字非诡异limitstring避免命令列表limitstring重名问题.面例该例我文件进行重命名并且使用heredocuments打印帮助:#!/bin/sh#wehavelessthan3arguments.Printthehelptext:if[$#-lt3];thencat4)函数您写些稍微复杂些程序您发现程序能几使用相同代码并且您发现我使用函数便函数:functionname()#insidethebody$1isthefirstargumentgiventothefunction#$2thesecondbody您需要每程序始函数进行声明  面叫做xtitlebar脚本使用脚本您改变终端窗口名称使用叫做help函数您看定义函数使用两#!/bin/sh#vim:setsw=4ts=4et:help()  catshiftby2  --)shift;break;;#endofoptions  -*)echo"error:nosuchoption$1.-hforhelp";exit1;;  *)break;;esacdoneecho"opt_fis$opt_f"echo"opt_lis$opt_l"echo"firstargis$1"echo"2ndargis$2"  您运行该脚本:cmdparser-lhello-f---somefile1somefile2  返结:opt_fis1opt_lishellofirstargis-somefile12ndargissomefile2  脚本何工作呢脚本首先所输入命令行参数进行循环输入参数与case表达式进行比较匹配则设置变量并且移除该参数根据unix系统惯例首先输入应该包含减号参数.第2部实例现我讨论编写脚本般步骤任何优秀脚本都应该具帮助输入参数并且写伪脚本(framework.sh)该脚本包含数脚本都需要框架结构非错主意候写新脚本我需要执行copy命令:cpframework.shmyscript 再插入自函数  让我再看两例: (1) 二进制十进制转换  脚本b2d二进制数(比1101)转换相应十进制数用expr命令进行数运算例:#!/bin/sh#vim:setsw=4ts=4et:help() cat第3部:调试  简单调试命令使用echo命令您使用echo任何怀疑错打印任何变量值绝数shell程序员要花费80%间调试程序原Shell程序处于需要重新编译插入echo命令需要少间  shell真实调试模式脚本"strangescript"错误您进行调试:sh-xstrangescript  执行该脚本并显示所变量值  shell需要执行脚本检查语模式使用:sh-nyour_script  返所语错误调试shell程序程  用户刚编写完Shell程序避免错误我利用Bsh提供跟踪选项该选项显示刚刚执行命令及参数用户通set命令打-x选项或启Shell使用-x选项Shell设置跟踪模式例面代码ice_tx:  if[$#-eq0]  then    echo"usage:sumintsintegerlist"    exit1  fi  sum=0  until[$#-eq0]  do    sum='expr$sum+$1'    shift  done  echo$sum  我用跟踪模式运行:  $sh-xice_tx234  结显示:  +[3-eq0]  +sum=0  +[3-eq0]  +expr0+2  +sum=2  +shift  +[2-eq0]  +expr2+3  +sum=5  +shift  +[1-eq0]  +expr5+4  +sum=9  +[0-eq0]  +echo9  9  面看跟踪模式Shell显示执行每条命令及该命令使用变量替换参数值些控制字if、then、until等没显示 参考技术A 你怎么执行的 可否再详细一点?

在本地进行shell脚本中执行svn命令,为啥提示bash: svn: command not found?

本地写shell脚本,并且在本地进行脚本的测试,其中有一项是从svn上拉取代码,本地电脑上已经安装了svn可是在执行命令时为什么会提示commond not found?

尝试修改/etc/profile文件,加入svn的路径。
或者使用定义个变量,如:SVNPATH=$PATH:/opt/subversion/bin,然后引入变量
export SVNPATH追问

不好意思,能不能麻烦您讲的再具体一些,刚刚学习shell脚本,实在是感觉无从下手啊,谢谢!!!!!!

追答

提示命令没有找到,一个简单的办法是执行svn命令时写svn的绝对路径。

参考技术A 1.[root@localhost ~]# which svn #查看命令的绝对路径
/opt/CollabNet_Subversion/bin/svn
2.[root@localhost ~]# export PATH=$PATH:/opt/CollabNet_Subversion/bin/svn
#修改环境变量,添加svn命令绝对路径
3.[root@localhost ~]# source .bashrc
4.[root@localhost ~]# echo $PATH #查看修改后的¥PATH值
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/CollabNet_Subversion/bin:/opt/CollabNet_Subversion/bin/svn:/opt/CollabNet_Subversion/bin/svn
5.[root@localhost ~]#svn --version #检测SVN 命令可用

以上是关于为啥C语言用execl执行bash shell脚本会出现Exec format error的主要内容,如果未能解决你的问题,请参考以下文章

C语言能否用在shell脚本

bash脚本编程

【exec】shell脚本中的 exec 命令

脚本概述

shell 脚本关键字&符号

shell脚本介绍结构和执行变量及date命令用法