sh指令使用php,linux sh 脚本调用外部命令

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

bash shell的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。

fork ( /directory/script.sh)

首先,我們所執行的任何程式,都是由父行程(parent process)所產生出來的一個子行程(child process),子行程在結束後,將返回到父行程去。此一現像在 Linux 系統中被稱為   fork 。

當子行程被產生的時候,將會從父行程那裡獲得一定的資源分配、及(更重要的是)繼承父行程的環境。

* 所謂環境變量其實就是那些會傳給子行程的變量。

簡單而言,"遺傳性"就是區分本地變量與環境變量的決定性指標。

然而,從遺傳的角度來看,我們也不難發現環境變量的另一個重要特徵:

* 環境變量只能從父行程到子行程單向繼承。換句話說:在子行程中的環境如何變更,均不會影響父行程的環境。

fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.

运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。

sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell。子进程与父进程唯一不同的地方在于pid(process id)。

exec (exec /directory/script.sh)

exec 也是讓 script 在同一個行程上執行,但是原有行程則被結束了。

也就是簡而言之:原有行程會否終止,就是 exec 與 source/fork 的最大差異了。

exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。(原线程被干掉,建立一个新线程???right?)

source (source /directory/script.sh)

* 所謂 source 就是讓 script 在當前 shell 內執行、而不是產生一個 sub-shell 來執行。

由於所有執行結果均於當前 shell 內完成,若 script 的環境有所改變,當然也會改變當前環境了﹗

与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.

可以通过下面这两个脚本来体会三种调用方式的不同:

1.sh

#!/bin/bash

A=B

echo "PID for 1.sh before exec/source/fork:$$"

export A

echo "1.sh: \$A is $A"

case $1 in

exec)

echo "using exec..."

exec ./2.sh ;;

source)

echo "using source..."

. ./2.sh ;;

*)

echo "using fork by default..."

./2.sh ;;

esac

echo "PID for 1.sh after exec/source/fork:$$"

echo "1.sh: \$A is $A

2.sh

#!/bin/bash

echo "PID for 2.sh: $$"

echo "2.sh get \$A=$A from 1.sh"

A=C

export A

echo "2.sh: \$A is $A"

运行以下3个脚本来观察结果:

1。$ ./1.sh fork

2。$ ./1.sh source

3。$ ./1.sh exec

05289a4996679899eb5a58a79abe7e26.png

2bca555e9a2df1fe230658739fd71ad8.png

543289c9bb825e407890b2d1577dce79.png

如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)

如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...

Perl调用外部命令(其他脚本、系统命令)的方法和区别

1. `command`; 使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值.   2. open LIST "ls -l| ...

Perl调用外部命令的方式和区别

主要的方式简述如下:1. system("command");使用该命令将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码. 2. exec(" ...

PHP调用外部命令

------------------------------------------------------------------ 一.PHP调用外部命令总结                     ...

PHP中调用外部命令的方法

在PHP中调用外部命令,可以用如下三种方法来实现: 方法一:用PHP提供的专门函数(四个): PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), she ...

Linux sh、source和.命令执行.sh文件的区别

sh文件介绍 .sh为Linux的脚本文件,我们可以通过.sh执行一些命令,可以理解为windows的.bat批处理文件. 点命令 .命令和source是同一个命令,可以理解为source的缩写,简称 ...

scala调用外部命令

scala调用外部命令 1.  导入sys.process包 2. 调用方式:" 外部命令 " !     双引号内+外部命令+感叹号 例:     scala调用外部命令工作原 ...

JDK1.5新特性,基础类库篇,调用外部命令类(ProcessBuilder)用法

一. 背景 ProcessBuilder类是用来创建操作系统进程的.与Runtime.exec相比,它提供了更加方便的方法以创建子进程. 每个ProcessBuilder实例管理着一个进程属性的集合. ...

Linux~Sh脚本一点自己的总结

从.netCore开源项目来看,eShopOnContainers来说,它的部署是跨平台的,可以部署在linux,docker上,在linux上运行它也可以写一些集成的小脚本,这是微信工程师为我们提供 ...

随机推荐

深入理解DOM事件类型系列第三篇——变动事件

× 目录 [1]删除节点 [2]插入节点 [3]特性节点[4]文本节点 前面的话 变动(mutation)事件能在DOM中的某一部分发生变化时给出提示,这类事件非常有用,但都只能使用DOM2级事件处理 ...

javascript 中断函数的使用 setInterval();

JEPF 3.1.2 发布,我们的软件机床(软件快速开发平台)

JEPF新一代软件快速开发平台(Java Elephant Platform)是一款优秀的平台产品,它本着灵活.快捷开发.高性能.高协作性.高稳定性.高可用性.人性化的操作体验为设计宗旨历经2年研发成 ...

hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句

package com.hanqi.test; import java.util.Date; import java.util.List; import org.hibernate.Query; im ...

STL的string和wstring

STL有字符串处理类——stirng和wstring,但是用的时候会觉得不是很方便,因为它不能像TCHAR一样根据定义的宏在char类型字符串和wchar_t进行转换,总不能因为程序要Unicode就 ...

winform中利用反射实现泛型数据访问对象基类(3)

继续完善了几点代码 满足没有主键的情况下使用 并且完善实体字段反射设置value时的类型转换 /// /// DAO基类 实体名必须要与数据表字段名一致 /// &lt ...

Python MYSQL - tiny ETL tool - 文件操作和数据库操作

import os import MySQLdb Con= MySQLdb.connect(host=',db='test') #链接数据库 cur=Con.cursor() os.chdir(&qu ...

富文本编辑器CKEDITOR的使用配置(问题注解)

CKEDITOR是一款非常轻便的富文本编辑器,如上图:参考网上的使用方法,我以.net为例,在aspx页面使用, 准备工作:首先要下载控件包,将解压后的整个文件夹添加到项目根目录. 第一步:引用js, ...

Oracle数据导入导出imp/exp(转)

在oracle安装目录下有EXP.EXE与IMP.EXE这2个文件,他们分别被用来执行数据库的导入导出.所以Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 一.Oracle ...

检测android机器是否有GPS模块

public boolean hasGPSDevice(Context context) { final LocationManager mgr = (LocationManager)context. ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值