我看shell的第一眼

我看shell的第一眼

1、脚本解释器设置

脚本第一行:#!/bin/sh

[[email protected] sun]# cat test.sh
#!/bin/sh

首先第一行可以拆分为两部分,#!和绝对路径,#!只是特殊的表示符,#!后面存放的是解释器地址(即shell存放路径)。注意,shell路径必须是全路径。其实第一行也不是非写不可,是可以省略的,不写第一行,可以手动指定shell,例如:sh   test.sh,手动指定shell,脚本文件还不必要求有执行权限。

2、shell执行脚本的过程

a、执行交互式命令

用户进入终端,shell进程已经被运行,用户输入一条命令,如果是shell内部命令(例如cd,exec),此时不会新建一个进程,内部命令其实就是shell里的一个子函数,就在当前进程执行完毕。如果是一个外部命令(例如ls,rm),则shell进程会先fork一个子进程,调用exec执行该命令,父进程调用wait()或waitpid()来等待子进程结束。

b、执行脚本文件

shell进程会先fork一个子进程,然后调用exec执行脚本文件。这个时候执行exec执行的另外一套机制,exec会读取文本文件的第一行,如果指定了解释器,则会调用指定的解释器,从解释器的_start开始执行,脚本文件的内容就当作参数传给解释器。

3、查看当前使用shell的方法

(1)echo $SHELL

[[email protected] Desktop]# echo $SHELL
  /bin/bash

(2)ps

[[email protected] Desktop]# ps
    PID TTY          TIME CMD
   3246 pts/0    00:00:00 bash
   3269 pts/0    00:00:00 ps

(3)输入一条不存在的命令,abcd

[[email protected] Desktop]# adcd
  bash: adcd: command not found

(4)ehco $0

[[email protected] Desktop]# echo $0
   /bin/bash

时间: 2024-11-01 11:48:03

我看shell的第一眼的相关文章

我的Linux学习历程:那些我看过的Linux书籍们

[+]查看原图http://www.ituring.com.cn/article/119401 来北京工作已经一个多月,大都市的生活比起读大学要忙碌得多,尤其是出行,基本以小时为基本的计时单位.有时茫然看着窗外车水马龙,会有些迷茫自己选择的是对还是错. 题外话不多说,回归这次的主题,扒一扒我看过的那些Linux相关的书籍. 对于Linux的了解和接触,缘起自大一时候的Linux限选课,老师说这门课可选可不选,但是选修后考试挂了的话需要补考.当时的我还比较爱学习,于是兴冲冲地选修了这门课,用的是清

Shell重定向文件描述符

#!/bin/bash  最近在看shell,各种困惑,不过解决困惑的感觉还是很不错的.废话少说,linux中使用文件描述符来标识每个文件对象.文件描述符为一个非负整数,可以唯一标识会话中打开的文件.每个过程最多可以有9个文件描述符. linux使用的标准文件描述符: 标准输入STDIN就是0,标准输出STDOUT就是1,标准错误输出STDERR就是2.而我们也可以自己创建文件描述符3~8. 将今天看到的一段代码: 1    #!/bin/bash 2    exec  3>&1 3    

【shell】使用 /dev/null crontab

1.linux组成kernel.shell.工具程序有sh.bash 一个例子 !#/bin/bash echo '' 执行之前chmod +x 执行./ 2.一个小窍门 cp /dev/null /var/log/apache2/access.log 利用/dev/null来晴空apache2中的日志文件 注释:把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚

如何调试shell脚本

今天看shell脚本攻略的时候,看见这个方法,感觉还是不错的 #!/bin/bash function DEBUG(){ [[ $_DEBUG == 'on' ]] && [email protected] || : } for i in {1..10} do DEBUG echo $i done _DEBUG=on ./debug.sh

linux单点登录shell

网上查了很多,没有效果,自己写了一个,虽然有点次,但是功能还是能实现了.废话少说,看shell #!/bin/sh function main { lines=`ps -eo user,pid,cmd | grep -v root |grep sshd`; tmp=0; array=(); for i in ${lines[*]} do if [ $(($tmp%4)) -eq 0 -o $(($tmp%4)) -eq 1 ] then array=(${array[@]} $i); fi tm

重复调用ab命令的shell代码和整理ab结果的java代码

先说下问题产生的背景,因为要做压力测试,频繁使用ab命令,需要测试好多项,每项测试要做10遍以上,测试完了还要画测试结果曲线,又因为公司内网不稳定,测十遍都找不到个准确值,所以只能在别人下班时测试.但是问题是,一旦服务器改了配置,就要把所有测试再做一遍,而且只能晚上测,而且只能晚上测,而且只能晚上测...重要的事情说三遍.所以我想啊,晚上测试,白头干啥?于是白天写脚本了,晚上运行一下,早上来看结果,做做曲线图. ab命令是一个很好的网站压力测试工具, 在mac下,查看帮助为 man ab 在li

(石头、剪刀、布)shell脚本,随机对比,case的应用

脚本实现人机<石头,剪刀,布>游戏,机器应用随机方法,结合用户输入给出结果,文章有两种方法,重在理解,第一种方法是该脚本的逻辑方面,第二种较容易理解.一 : 第一种方法,让机器给出一个随机数字 0-2,我们可以假设有一个数组为game(石头 剪刀 布),game[0]=石头 game[1]=剪刀 game[2]=布,我们将num的变量想作是 game[num],数组里面位.结合case语句,我们给用户的印象是,当输入1的时候为石头,那么这时候game[0]为石头,直接在case语句里面做出判断

@Override 看这一篇就够了

一.是什么 一句话:它是表示重写的注解 @Override注解是伪代码,用于表示被标注的方法是一个重写方法. 不写也完全可以,但强烈建议写上! 二.为什么用 既然不写@Override也可以重写父类的方法,那为什么非要“多此一举”写上这个注解呢? 使用@Override注解主要有两个好处: 1)帮助自己检查是否正确的重写父类方法 2)明显的提示看代码的人,这是重写的方法 三.举例说明 1.当我们在子类中重写父类的方法时,如果不小心写错名字或者写错参数,编译器是不会报错的,因为他会认为你在子类扩展

快,学会 shell

本文分成入门篇和基础篇.基础篇包括变量.字符串处理.数学运算三部分.基础篇包括流控制.函数和函数库三部分.主要是基于例子进行讲解,其中有 4 个复杂一点的脚本,看懂了也就入门了. 我们先来聊一聊 shell 和 shell script 的概念.计算机的运行离不开硬件,我们通过操作系统(OS,Operating System)操作硬件,而我们所说的 linux 严格来说是操作系统(OS)的核心部分--内核(Kernel).我们无法直接操作 kernel,需要借助于 kernel 外的一层壳 sh