提示:以下是介绍为什么写这篇文章:
先来说一下主要以下有几种方式:
fork
是最普通的, 就是直接在脚本里面用 path/to/foo.sh
来调用foo.sh
这个脚本,比如如果是 foo.sh
在当前目录下,就是 ./foo.sh
。运行的时候 terminal
会新开一个子 Shell 执行脚本 foo.sh
,子 Shell
执行的时候, 父 Shell
还在。子 Shell
执行完毕后返回父 Shell
。 子 Shell
从父 Shell
继承环境变量,但是子 Shell
中的环境变量
不会带回父 Shell
。
exec
与 fork
不同,不需要新开一个子 Shell
来执行被调用的脚本. 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec
调用一个新脚本以后, 父脚本中 exec
行之后的内容就不会再执行了。这是 exec 和 source
的区别.
与 fork
的区别是不新开一个子 Shell
来执行被调用的脚本,而是在同一个 Shell
中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。
其实从命名上可以感知到其中的细微区别,下面通过两个脚本来体会三种调用方式的不同:
第一个脚本,命名为script1.sh:
#!/usr/bin/env bash
A=1
echo "before exec/source/fork: PID for 1.sh = $$"
export A
echo "In 1.sh: variable A=$A"
case $1 in
--exec)
echo -e "==> using exec…\n"
exec ./2.sh ;;
--source)
echo -e "==> using source…\n"
. ./2.sh ;;
*)
echo -e "==> using fork by default…\n"
./2.sh ;;
esac
echo "after exec/source/fork: PID for 1.sh = $$"
echo -e "In 1.sh: variable A=$A\n"
第二个脚本,我们命名为 2.sh:
#!/usr/bin/env bash
echo "PID for 2.sh = $$"
echo "In 2.sh get variable A=$A from 1.sh"
A=2
export A
echo -e "In 2.sh: variable A=$A\n"
注:这两个脚本中的参数 $$
用于返回脚本的 PID
, 也就是进程 ID
。这个例子是想通过显示 PID
判断两个脚本是分开执行还是同一进程里执行,也就是是否有新开子 Shell
。当执行完脚本 2.sh 后,脚本 1.sh 后面的内容是否还执行。
$ ./1.sh
PID for 1.sh before exec/source/fork:5845
1.sh: $A is B
using fork by default…
PID for 2.sh: 5242
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5845
1.sh: $A is B
fork
方式可以看出,两个脚本都执行了,运行顺序为1-2-1
,从两者的PID值,可以看出,两个脚本是分成两个进程运行的。
$ ./1.sh – exec
PID for 1.sh before exec/source/fork:5562
1.sh: $A is B
using exec…
PID for 2.sh: 5562
2.sh get $A=B from 1.sh
2.sh: $A is C
exec
方式运行的结果是,2
执行完成后,不再回到1
。运行顺序为1-2
。从pid
值看,两者是在同一进程中运行的。
$ ./1.sh source
PID for 1.sh before exec/source/fork:5156
1.sh: $A is B
using source…
PID for 2.sh: 5156
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5156
1.sh: $A is C
source
方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行。
只需使用&&连接器(即复合命令):
./script1.sh && ./script2.sh
但是请注意,只有script1.sh 即第一个脚本退出代码为0(即没有错误)时,才会执行第二个脚本。
如果要执行序列,无论第一个脚本的结果如何,只需执行以下操作
./script1.sh ; ./script2.sh
您可以测试两个连接器的行为:
$ true && echo aa
aa
$ false && echo aa
$ false ; echo aa
aa
除了exec
之外,其他都可以顺序执行,只是如果对环境变量有要求的话,就要分辨使用fork
还是source
了
RECON是一款寻找重复序列的软件,因工作之故,接触了两天,挫折不少,札记于下:安装如readme文档中所言即可。注意:recon.pl脚本中的path参数最好为绝对路径(至少在我的机器上使用相对路径有时候会出错)。如果是Windows机器上安装了Cygwin,并且使用了Cygwin中的perl编译器,那么由于两大操作系统中命令的冲突(反映在recon中,为sort命令的冲突),会导致“命令指定
不同的公司面试内容不同,有的注重基础知识有的注重项目,对实习生,也就是应届生,更多的是基础因为没有什么工作经验,项目很多也不怎么样,所以也就问的少。下面是我的一点面试经验我面试次数不多,可能是运气比较好,几家就有了一个很满意的。一共面过两次大数据职位一次java,一次商务智能,数据分析的。 第一次就是大数据的,数据平台开发,小公司,没有笔试,就是拿着简历上的...
java.lang.NullPointerException at org.apache.jsp.***_jsp._jspInit(***_jsp.java:22)
没计算资源,只能简单测试下resnet18训练代码(带验证):'''TODO:- 采用更深的网络(简单,但是需要计算资源)- top3 accuracy,可参考https://github.com/pytorch/examples/blob/master/imagenet/main.py'''#pkill -9 python#nvidia-smiimport osimport tor
百度搜索使用技巧,使用SEO指令进行检索,快速得到想要的结果,使用 intitle 搜索网站标题,intext 搜索网站正文内容,inurl 搜索指定类型网站或网址,限定时间范围检索,排除或包含关键字等等......
1.基本介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能能操作,即扩展目标对象的功能。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代理模式有不同的形式,主要有三种静态代理动态代理(JDK代理)Cglib代理(可以在内存动态的创建对象,而不需要实现接口)2.静态代理2.1 基本介绍:静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现
Odoo是一种流行的开源商务应用程序套件,可帮助公司管理和运营其业务,也可用于在线教学。它包括广泛的应用程序。Debian GNU/Linux 是社区版服务器的代表。本文将介绍如何在Debian GNU/Linux中以源码方式安装和部署Odoo 14(已在Debian 10及Debian 11中测试通过)。1.安装依赖# apt install git python3-pip build-essential wget python3-dev p
http://blog.csdn.net/majiakun1/article/details/46551137SQLCipher 是用来加密数据库一. 1.安装sqlcipher命令,首先需要安装brew, 在终端输入 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/inst
基于mysql存储过程实现自增批量插入数据1、创建数据库表-- 创建数据库CREATE DATABASE IF NOT EXISTS db_mysql DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;-- 创建用户CREATE USER 'test'@'%' IDENTIFIED BY '123456';-- 授权GRANT ALL ON db_mysql.* TO 'test'@'%';-- 创建测试表CREATE TABLE
一、修复MBR:MBR(Master Boot Record主引导记录): 硬盘的0柱面、0磁头、1扇区称为主引导扇区。其中446Byte是bootloader,64Byte为Partition table,剩下的2Byte为magic number。备份MBR: #dd if=/dev/sda of=/root/mbr.bak count=1 bs=512破坏...
python gui 中三大框架tkinter,wxpython, pyqtTkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tkinter的缺点,如果你想要构建一个GUI界面布局,你就必须自己写代码,因为Tkinter没有提供一个图形界面设计器,我估计这也是很多人没有选择它来做软件的一个最主要原因。(QT给我们带来最方便的好处,就是它有
刚开始用一个数据源,但是上头要求要做多数据源切换的。看了框架有自带的可以切数据源但是数据源是固定在YML文件的;一、固定多个数据源切换1.由于我这个版本的自带DynamicDataSource包 我就不引入了。各位看官缺包自行去maven上查Dynamic-DataSource第一个就是了。2.在yml中配置两个数据源3.启动时启动连接池的方法获取,在APPLICATION启动...