linux中的shell究竟是什么

linux中的shell究竟是什么,第1张

linux是早期是个内核,后来添加了其他功能成了 *** 作系统。

内核就是 *** 作系统的核心,管理设备,cpu调度,内存管理等。

内核有些api可以被外面程序员调用。这些api叫做“系统调用”。

常用的系统调用被集合成一个个命令程序。如ls,cd,rm等。。

shell是linux系统的一个解释程序。用于方便执行一些命令程序。就是外壳程序,编写shell脚本,用来批量执行命令来管理系统。 相当于windows的cmd程序吧

我的一个简单理解。有误请指正。

list=`ls -l|grep -v grep|grep -v 0|grep -v exportsh|sort -n|awk {'print $9'}`

| 是管道符,将前面命令的执行结果传递给后面的命令。

学会拆分开来看就不难理解,其实可以一步一步地执行看看结果,比如先执行 ls -l ,再执行ls -l|grep -v grep,再执行ls -l|grep -v grep|grep -v 0,看有什么变化。

这句意思就是,将 ls -l 命令的结果中,去除包含grep、0以及exportsh的行,用sort排序后取出第9列内容(即文件名列表),保存到list变量中。后面的arg即为按顺序从文件名列表中取出的每个文件名。

len=${#arg} #get string len

这一句后面已经有注释了,获取arg字符串长度。

tab=${arg:0:len-4} #get filename not include extend name

这句后面也有注释了,获取文件名中除扩展名外的部分。字面解释,就是获取第0个字符到第(长度-4)个字符之间的字符串(扩展名加一共4个字符)。

echo "bcp ${tab} in /opt/sybase/sdb/ln_data/${arg} -Uname -Ppwd -Sserver -c -t'||' -r'&&\n' -b10 >>/errtxt 2>&1"

打印 echo 后面的语句。语句中的变量被展开。

我觉得这句有问题,最后的输出重定向 >>/errtxt 2>&1 应该拿到双引号外面来,而且如果仅保存错误信息到errtxt的话,应该写成 2>>/errtxt

脚本是批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算 *** 作动作的组合,在其中可以实现一定的逻辑分支等。

脚本程序相对一般程序开发来说比较接近自然语言,可以不经编译而是解释执行,利于快速开发或一些轻量的控制。

现在的脚本语言是比较多的,一般的脚本语言的执行只同具体的解释执行器有关,所以只要系统上有相应语言的解释程序就可以做到跨平台。

脚本(Script),就是含有bind和alias等命令的集合,你可以把这个集合存为一个独立的文件然后在需要的时候执行,这样就可以方便你在CS中的使用。

脚本可以存为后缀名为cfg的文件放在cstrike文件夹下,执行时在控制台输入:exec (脚本文件名)cfg 即可。比如将一个脚本存为buyscfg文件,则在控制台中输入:exec buyscfg则可以实现我们所需要的功能。要实现一个命令只要把这一过程定义(alias)好,并且分配一个键位给这个命令,以后只要按分配好的键位,就可以实现这一过程。所有的脚本都是通过这一方法实现的。

脚本�(Script), 是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。脚本通常可以由应用程序临时调用并执行。各类脚本目前被广泛地应用于网页设计中,因为脚本不仅可以减小网页的规模和提高网页浏览速度,而且可以丰富网页的表现,如动画、声音等。举个最常见的例子,当我们点击网页上的E-mail地址时能自动调用OutlookExpress或Foxmail这类邮件软件,就是通过脚本功能来实现的。又如洪恩网站�>

Q1: shell如何执行“简单”命令?

A: 这里的简单命令和bash参考手册里的含义相同,形式上一般是:命令的名称加上它的参数。有三种不同的简单命令:

1内置命令(builtin)

是shell解释程序内建的,有shell直接执行,不需要派生新的进程。有一些内部命令可以用来改变当前的shell环境,如:

cd /path

var=value

read var

export var

2外部命令("external command" or "disk command")

二进制可执行文件,需要由磁盘装入内存执行。会派生新的进程,shell解释程序会调用fork自身的一个拷贝,然后用exec系列函数来执行外部命令,然后外部命令就取代了先前fork的子shell。

3shell脚本(script)

shell解释程序会fork+exec执行这个脚本命令,在exec调用中内核会检查脚本的第一行(如:#!/bin/sh),找到用来执行脚本的解释程序,然后装入这个解释程序,由它解释执行脚本程序。解释程序可能有很多种,各种shell(Bourne shell,Korn shell cshell,rc及其变体ash,dash,bash,zshell,pdksh,tcsh,es),awk,tcl/tk,expect,perl,python,等等。在此解释程序显然是当前shell的子进程。如果这个解释程序与当前使用的shell是同一种shell,比如都是bash,那么它就是当前shell的子shell,脚本中的命令都是在子shell环境中执行的,不会影响当前shell的环境。

Q2: shell脚本是否作为单独的一个进程执行?

A: 不是,shell脚本本身不能作为一个进程。如上面讲的,shell脚本由一个shell解释程序来解释、运行其中的命令。这个shell解释程序是单独的一个进程,脚本中的外部命令也都作为独立进程依次被运行。这也就是为什么ps不能找到正在运行的脚本的名字的原因了。作为一个替代方案,你可以这样调用脚本:

sh script-name

这时shell解释程序“sh”作为一个外部命令被显式地调用,而script-name作为该命令的命令行参数可以被我们ps到。

另外,如果你的系统上有pidof命令可用,它倒是可以找出shell脚本进程(实际上应该是执行shell脚本的子shell进程)的进程ID:

pidof -x script-name

Q3: shell何时在子shell中执行命令?

A: 在此我们主要讨论Bourne shell及其兼容shell。在许多情况下shell会在子shell中执行命令:

1()结构

小括号内的命令会在一个子shell环境中执行,命令执行的结果不会影响当前的shell环境。需要注意是此时变量$$会显示当前shell的进程id,而不是子shell的进程id。

参考:

{;}结构中的命令在当前shell中执行,(内部)命令执行的结果会影响当前的shell环境。

2后台执行或异步执行

command&

命令由一个子shell在后台执行,当前shell立即取得控制等候用户输入。后台命令和当前shell的执行是并行的,但没有互相的依赖、等待关系,所以是异步的并行。

3命令替换

`command`(Bourn shell及兼容shell/csh)

$(command)(在ksh/bash/zsh中可用)

将command命令执行的标准输出代换到当前的命令行。command在子shell环境中执行,结果不会影响当前的shell环境。

4管道(不同的shell处理不同)

cmd1|cmd2

cmd1和cmd2并行执行,并且相互有依赖关系,cmd2的标准输入来自cmd1的标准输出,二者是“同步”的。

对管道的处理不同的shell实现的方式不同。

在linux环境下大多数shell(bash/pdksh/ash/dash等,除了zshell例外)都将管道中所有的命令在子shell环境中执行,命令执行的结果不会影响当前的shell环境。

Korn shell的较新的版本(ksh93以后)比较特殊,管道最后一级的命令是在当前shell执行的。这是一个feature而非BUG,在POSIX标准中也是允许的。这样就使下面的命令结构成为可能:

command|read var

由于read var(read是一个内部命令)在当前shell中执行,var的值在当前shell就是可用的。

反之bash/pdksh/ash/dash中read var在子shell环境中执行,var读到的值无法传递到当前shell,所以变量var无法取得期望的值。类似这样的问题在各种论坛和news group中经常被问到。个人认为command|read var的结构很清晰,并且合乎逻辑,所以我认为Korn shell的这个feature很不错。可惜不是所有的shell都是这样实现的。:(如开源的pdksh就是在子shell执行管道的每一级命令。

Korn shell对管道的处理还有一个特殊的地方,就是管道如果在后台执行的话,管道前面的命令会由最后一级的命令派生,而不是由当前shell派生出来。据说Bourne shell也有这个特点(标准的Bourne shell没有测试环境,感兴趣的朋友有条件的可以自行验证)。但是他们的开源模仿者,pdksh和ash却不是这样处理。

以上就是关于linux中的shell究竟是什么全部的内容,包括:linux中的shell究竟是什么、SHell脚本解释:麻烦哪位把下面的代码仔细注释一下,感谢!、什么叫脚本程序(比如linux的shell脚本),如何解释给学生听等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9610640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存