linux shell 调用shell shell调用函数

linux shell脚本执行命令详解

在Linux下,如果你需要执行shell脚本,那么应该使用那个命令呢?下面由我为大家整理了linux shell脚本执行命令的相关知识,希望对大家有帮助!

linux shell脚本执行

linux shell脚本执行方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本:

cd/data/shell

./hello.sh

./的意思是说在当前的工作目录下执行hello.sh。如果不加上./,bash可能会响应找到不到hello.sh的错误信息。因为目前的工作目录(/data/shell)可能不在执行程序默认的搜索路径之列,也就是说,不在环境变量PASH的内容之中。查看PATH的内容可用 echo$PASH命令。现在的/data/shell就不在环境变量PASH中的,所以必须加上./才可执行。

linux shell脚本执行方法二:以绝对路径的方式去执行bash shell脚本:

/data/shell/hello.sh

linux shell脚本执行方法三:直接使用bash或sh来执行bash shell脚本:

cd/data/shell

bash hello.sh

cd/data/shell

sh hello.sh

注意,若是以方法三的方式来执行,那么,可以不必事先设定shell的执行权限,甚至都不用写shell文件中的第一行(指定bash路径)。因为方法三是将hello.sh作为参数传给sh(bash)命令来执行的。这时不是hello.sh自己来执行,而是被人家调用执行,所以不要执行权限。那么不用指定bash路径自然也好理解了啊。

linux shell脚本执行方法四:在当前的shell环境中执行bash shell脚本:

cd/data/shell

. hello.sh

cd/data/shell

source hello.sh

前三种方法执行shell脚本时都是在当前shell(称为父shell)开启一个子shell环境,此shell脚本就在这个子shell环境中执行。shell脚本执行完后子shell环境随即关闭,然后又回到父shell中。而方法四则是在当前shell中执行的。

linux下怎样用c语言调用shell命令

C程序调用shell脚本共同拥有三种法子:system()、popen()、exec系列数call_exec1.c,

system()不用你自己去产生进程。它已经封装了,直接增加自己的命令

exec须要你自己 fork进程,然后exec自己的命令

popen()也能够实现运行你的命令,比system开销小

方法一、system()的使用。我直接上代码吧

int system(const char*command);

我在/home/book/shell新建一个test.sh文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#!bin/bash

echo$HOME

echo"the is test!"</span></span>

test.c文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#include<stdlib.h>

int main()

{

system("bash/home/book/shell/test.sh");/* chmod+x test.sh,路径前面要加上bash*/

return 0;

}</span></span>

运行例如以下命令来编译:

<span style="font-size:18px;">gcc test.c-o test

</span>

测试命令:

<span style="font-size:18px;">./test</span>

结果例如以下:

<span style="font-size:18px;">/root

the is test!</span>

方法二:popen()会调用fork()产生子历程,然后从子历程中调用/bin/sh-c来履行参数command的指令。参数type可应用“r”代表读取。“w”代表写入。遵循此type值。popen()会建立管道连到子历程的标准输出设备或标准输入设备,然后返回一个文件指针。

随后历程便可利用此文件指针来读取子历程的输出设备或是写入到子历程的标准输入设备中。此外,全部应用文件指针(FILE*)操作的函数也都能够应用,除了fclose()以外。

返回值:若成功则返回文件指针,否则返回NULL,差错原因存于errno中。注意:在编写具SUID/SGID权限的程序时请尽量避免应用 popen()。popen()会继承环境变量。通过环境变量可能会造成系统安全的问题

FILE*popen(const char*command, const char*type);

int pclose(FILE*stream);

其它不用改变我们直接改动test.c文件:

#include<stdio.h>

int main()

{

char buffer[80];

FILE*fp=popen("bash/home/book/shell/test.sh","r");

fgets(buffer,sizeof(buffer),fp);

printf("%s",buffer);

pclose(fp);

return 0;

}

方法三:exec函数簇(我不太懂,copy别人的。也没有验证。习惯方法一)

须要注意的是exec并非1个函数,事实上它仅仅是一组函数的统称,它包含以下6个函数:

#include<unistd.h>

int execl(const char*path, const char*arg,...);

int execlp(const char*file, const char*arg,...);

int execle(const char*path, const char*arg,..., char*const envp[]);

int execv(const char*path, char*const argv[]);

int execvp(const char*file, char*const argv[]);

int execve(const char*path, char*const argv[], char*const envp[];

能够见到这6个函数名字不同,并且他们用于接受的参数也不同.

实际上他们的功能都是几乎相同的,由于要用于接受不同的参数所以要用不同的名字区分它们,毕竟c语言没有函数重载的功能嘛..

可是实际上它们的命名是有规律的:

exec[l or v][p][e]

exec函数里的参数能够分成3个部分,运行文件部分,命令参数部分,环境变量部分.

比如我要运行1个命令 ls-l/home/gateman

运行文件部分就是"/usr/bin/ls"

命令参赛部分就是"ls","-l","/home/gateman",NULL见到是以ls开头每1个空格都必须分开成2个部分,并且以NULL结尾的啊.

环境变量部分,这是1个数组,最后的元素必须是NULL比如 char* env[]={"PATH=/home/gateman","USER=lei","STATUS=testing", NULL};

好了说下命名规则:

e兴许,参数必须带环境变量部分,环境变零部分参数会成为运行exec函数期间的环境变量,比较少用

l兴许,命令参数部分必须以","相隔,最后1个命令参数必须是NULL

v兴许,命令参数部分必须是1个以NULL结尾的字符串指针数组的头部指针.比如char* pstr就是1个字符串的指针, char* pstr[]就是数组了,分别指向各个字符串.

关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html

p兴许,运行文件部分能够不带路径, exec函数会在$PATH中找

还有1个注意的是, exec函数会代替运行它的进程,也就是说,一旦exec函数运行成功,它就不会返回了,进程结束.可是假设exec函数运行失败,它会返回失败的信息,并且进程继续运行后面的代码!

通常exec会放在fork()函数的子进程部分,来替代子进程运行啦,运行成功后子程序就会消失,可是运行失败的话,必须用exit()函数来让子进程退出!

shell脚本调用另一个shell脚本怎么做

Shell脚本的函数功能与其它编程语言类似,具备输入参数与输出值的特点,可重复调用以简化操作。在Linux的System V init系统中,很多功能通过Shell函数封装实现,如/等/init.d/下的文件。

定义函数的步骤如下:

使用函数名与括号定义函数,函数体包含命令与操作。

调用函数直接使用函数名与参数,参数以$1、$2等引用。

函数支持参数,通过$1、$2等变量引用,实现更灵活的功能。

函数返回值通过$?变量获取,0表示成功,非0表示失败。

函数内部变量默认为局部变量,仅在函数内有效。需使用local声明局部变量,global声明全局变量。

函数变量作用域可通过declare、typeset设置。函数内部定义的变量仅在函数内可用,外部访问提示未定义。

在函数中访问外部变量需使用global声明变量为全局,实现函数内外的变量共享。

阅读剩余
THE END