linux下执⾏shell命令⽅法简介linux命令及shell编写
linux下执⾏shell命令有两种⽅法
1. 在当前shell中执⾏shell命令
2. 在当前shell中产⽣⼀个subshell,在subshell中执⾏shell命令
1.在当前shell中执⾏shell命令
主要就是在命令⾏中通过交互⽅式⽅式直接输⼊shell命令,命令⾏直接执⾏给出结果.⽐如这样:
2.在当前shell中产⽣⼀个subshell,在subshell中执⾏shell命令
⽐如我们把shell写成shell脚本的⽅式来运⾏,这个时候会先启动⼀个subshell来代替当前的shell,然后执⾏shell脚本⽐如
#demo.sh
#!/bin/bash
read -p "please input your name:" name
echo "hello $name"
添加执⾏权限 chmod +x demo.sh 执⾏如下
这个脚本功能很简单,就是输出⼀⾏话,提⽰⽤户输⼊⾃⼰的名字,然后脚本输出hello xxx。我主要想说下执⾏结果及其分析。先来⼀张图:
⾸先我这边是启动了两个shell,这个时候左右两个shell的pid号分别是2473和2505,并且这两个进程都是从⼀个叫做进程ID号为2465的进程中fork出来的⼦进程。当执⾏了./demo.sh之后,会看到有三个bash的进程,进程ID分别是2473、2505、2633.其中2473和2505的分别对应之前的两个shell的进程ID。多出了⼀个pid为2633的进程。这个进程其实就是我们说的subshell。看下这个pid为2633的进程的⽗进程的进程号是2473,就是说是从pid为2473的shell进程中启动⼀个subshell,subshell的进程ID号为2633。当我们输⼊完warjiang,之后,脚本继续执⾏,执⾏完毕之后,subshell进程退出。
这个时候我们再去查看进程的时候,就会发现少了pid为2633的进程,也就是少了前⾯那个subshell。
讲到这⾥,对于在当前终端中执⾏shell与在当前终端中启动subshell执⾏shell两种⽅式执⾏shell也是有了⼀定程度的了解。下⾯将引出source命令与在终端中执⾏shell脚本的区别。
source与bash的区别
严格的来说,我这个标题有毒,因为source命令本来就是属于bash中的⼀部分。我这⾥其实想说的是source demo.sh与bash demo.sh的区别。
相信⼤家但凡有linux下的开发、运维经验的codeframer都会配置过什么jdk等等之类的环境变量,⼤家⼀定都会记得⾃⼰都执⾏过source ~/. ,那么这个source到底是什么.先把这个问题放⼀放,我们先往下看.还是上⾯的那个demo.sh的脚本.下⾯我们来⽐较⼀下bash demo.sh(或者先执⾏chmod +x demo.sh 再执⾏./demo.sh)与source demo.sh的区别。
其中靠上⾯的⼀张图⽚是执⾏./demo.sh的截图,靠下⾯的⼀张是source demo.sh。⽐较两张图⽚,显然,两张图⽚最⼤的区别在于,上⾯⼀张图⽚多了⼀个subshell也就是pid为2633进程的出现再消失的过程。所以如果执⾏执⾏shell脚本,当前命令⾏会⾃动产⽣⼀个⼦进程,当执⾏完脚本之后,会⾃动把这个⼦进程关闭。但是souce命令不会产⽣新的⼦进程,⽽是在当前终端进程中读取并执⾏shell脚本。
所以 source与bash的最⼤区别在于source不⽤启动新的shell,⽽bash需要启动新的shell
再回到上⾯那个source ~/.bashrc,其实相当于在当前的终端中执⾏~/.bashrc,⽽.bashrc⽂件中的内容就是中关于export PATH部分的语句,也就是设置PATH变量,执⾏source ~/.bashrc让配置的新的环境变量PATH在当前终端中⽣效.
source与(.)
这边的话,~/.bash_aliases⼀般⽤过alias的持久化,记录⽤户的alias记录。直观上来看,执⾏. ~/.bash_aliases应该是设置⼀些aliases中的变量别名。那么这个.是什么.其实这⾥的.与source的作⽤
是⼀样,表⽰在当前的终端中执⾏脚本,这样就可以让当前的终端共享aliases中的alias配置信息
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论