shell脚本中执行脚本执行命令

正文 bash shell脚本执行的几种方法
bash shell脚本执行的几种方法
发布时间: & 编辑:
bash shell脚本执行的几种方法
[root@localhost home]# cd /root/
[root@localhost ~]#vim hello.sh
#!& /bin/bash
echo &hello guys!&
echo &welcome to my Blog:linuxboy.org!&
1.切换到shell脚本所在的目录,执行:
复制代码 代码如下:
[root@localhost ~]# ./hello.sh
-bash: ./ hello.sh: 权限不够
2.以绝对路径的方式执行:
复制代码 代码如下:
[root@localhost ~]# /root/Desktop/hello.sh
-bash: /root/Desktop/ hello.sh: 权限不够
3.直接用bash或sh执行:
复制代码 代码如下:
[root@localhost ~]# bash hello.sh
hello guys!
welcome to my Blog:linuxboy.org!
[root@localhost ~]# pwd
[root@localhost ~]# sh hello.sh
hello guys!
welcome to my Blog:linuxboy.org!
[root@localhost ~]# pwd
&& 注意:用以上三种方法执行shell脚本,现行的shell会开启一个子shell环境,去执行shell脚本,前两种必须要有执行权限才能够执行。也可以让shell脚本在现行的shell中执行:
4.现行的shell中执行
复制代码 代码如下:
[root@localhost ~]# . hello.sh
hello guys!
welcome to my Blog:linuxboy.org!
[root@localhost tmp]# pwd
[root@localhost ~]# source hello.sh
hello guys!
welcome to my Blog:linuxboy.org!
[root@localhost tmp]# pwd
&&& 对于第4种不会创建子进程,而是在父进程中直接执行。
&&& 上面的差异是因为子进程不能改变父进程的执行环境,所以CD(内建命令,只有内建命令才可以改变shell 的执行环境)没有成功,但是第4种没有子进程,所以CD成功。
您可能感兴趣的文章:linux&C中调用shell命令和运行shell脚本
1、system(执行shell
相关函数 fork,execve,waitpid,popen
表头文件 #include&stdlib.h&
定义函数 int system(const char * string);
函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-c
string来执行参数string字符串所代表的命令,此命令执行完后随
即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时
搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值 如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-
1。若参数string为空指针(NULL),则返回非零值。如果system()调
用成功则最后会返回执行shell命令后的返回值,但是此返回值也有
可能为system()调用/bin/sh失败所返回的127,因此最好能再检查
errno 来确认执行成功。
附加说明 在编写具有SUID/SGID权限的程序时请勿使用system(),system()会
继承环境变量,通过环境变量可能会造成系统安全的问题。
#include&stdlib.h&
system(“ls -al /etc/passwd /etc/shadow”);
2、popen(建立管道I/O)
相关函数 pipe,mkfifo,pclose,fork,system,fopen
表头文件 #include&stdio.h&
定义函数 FILE * popen( const char * command,const char *
函数说明 popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c
来执行参数command的指令。参数type可使用“r”代表读取,“w”
代表写入。依照此type值,popen()会建立管道连到子进程的标准输
出设备或标准输入设备,然后返回一个文件指针。随后进程便可利
用此文件指针来读取子进程的输出设备或是写入到子进程的标准输
入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使
用,除了fclose()以外。
返回值 若成功则返回文件指针,否则返回NULL,错误原因存于errno中。
错误代码 EINVAL参数type不合法。
注意事项 在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()
会继承环境变量,通过环境变量可能会造成系统安全的问题。
#include&stdio.h&
char&buffer[80];
fp=popen(“cat /etc/passwd”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
执行 root :x:0 0: root: /root: /bin/bash
3、使用vfork()新建子进程,然后调用exec函数族
#include&unistd.h&
* argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*)
if(vfork() = =0)
execv(“/bin/ls”,argv);
}else{ & & &
& & printf(“This is the parent
process\n”);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我在执行 sh 文件的时候,执行到 mkdir 命令就很会报错。下面是我的代码:
#!/bin/bash
logFilePath="/usr/local/python/data_analysis_log/"
if [ ! -x "$logFilePath" ] ;
  mkdir "$logFilePath"
报的错是:
test.sh: 7: test.sh:   mkdir: not found
环境是 ubuntu14.04
查了网上的一些资料,么有找到解决方案,请问各位有遇到过这样的问题吗?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
已解决。。。去掉“;”就好了,我也不知道为什么。。。。。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
如果题主的/usr/local/python/目录存在, 则不会有错误; 如果不存在, 则因为没有使用-p选项, 创建多层目录时, 正确的错误信息是no such file or directory.
因此, 根据题主的信息, 建议执行which mkdir查看mkdir的执行路径, 但既然找不到mkdir, 前命令多半生效. 正常情况下, mkdir位于/bin/mkdir. 执行ls /bin | grep mkdir, 如果找不到, 则说明楼主的系统可能被改过.
其实, 更可能的原因是, /bin目录不在PATH中, 执行echo $PATH, 查找/bin目录是否存在. 在安装不同的软件时, 都可能更改PATH, 大部分情况下, 都会推荐用export PATH=$PATH:..., 但总有些软件会直接export PATH=....
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
实际上这个问题的原因不在于; 提示找不到命令,问题在PATH,解决的方法有如下:
1.指定路径
如果你能在login shell上执行mkdir,那么可以用:
/bin/mkdir "$logFilePath"
#指定该命令的地址
或者是像@enali说的那样export。
2.在subshell中执行
一般shell脚本的执行是会起一个child进程,这个进程会继承一些父进程的一些变量(所以像PATH这样就有可能没有被集成到),不过对于subshell而言,它所继承到的变量要比child进程多的多。同时subshell对父进程没有任何的影响。
( mkdir "$logFilePath" )
这样就可以了。
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 Appshell 脚本中,如何让当前脚本运行完毕,自动关闭终端?【linux吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:175,338贴子:
shell 脚本中,如何让当前脚本运行完毕,自动关闭终端?收藏
shell 脚本中,如何让当前脚本运行完毕,自动关闭终端?
运行完就自动关了和windows上运行batch一样
脚本运行完了,可以自动把当前终端关了吗?
让shell 脚本控制键盘,当终端窗口为活动时输入关闭终端的命令和回车。
exec 脚本文件
你的意思是在一个你已经打开了的终端里运行脚本?你可以给你的脚本结尾加上exit试试
不可以。要搞清楚父子进程的关系。除非用比较复杂的办法找到父shell的pid并且这样可能造成僵尸进程
一种渣法:$ sh 敏感瓷.sh && exit渣度接着吃
与其让子进程结束父进程, 不如让父进程wait子进程, 然后父进程自动结束。
还知道什么呀,都说出来
有办法了,就在末尾加了句killall gnome-terminal
你这样会把其他的terminal也关掉的
目前也没有他法,kill
`pidof gnome-terminal` 也会把所以都关了
其实很简单,你在执行脚本的时候不用./***.sh使用. ***.sh就不用另起一个shell执行脚本,在脚本里使用exit就可以推出终端了
没必要把生命浪费在不必要的问题上。
登录百度帐号推荐应用

我要回帖

更多关于 脚本调用脚本 的文章

 

随机推荐