《学习bash》笔记--命令行处理

shell从标准输入或脚本中读取的每行称为一个管道行,它包含一或多个由0个或多个管道符分割的命令,对其读取的每个管道

行,执行下面的操作。


1.将命令分成由固定元字符集分隔的记号:SPACE、TAB、NEWLINE、;、(、)、<、>、|和&。记号类型
包括单词、关键字、I/O重定向符和分号。
2.检测每个命令的第一个记号,查看为不带引号或反斜线的关键字。如果是一个开放的关键字,如if和
其他控制结构起始字符串、function、{或(,则命令实际上为一复合命令。shell在内部对复合命令进行
处理,读取下一个命令,并重复这一过程。如果关键字不是复合命令的起始字符串(例如,是一个控制
结构中间出现的关键字,如then、else或do等),则shell给出语法错误信号。
3.依据别名列表检查每个命令的第一个关键字。如果找到相应匹配,则替换其别名定义,并退回到第一步;
否则进入第4步,该策略允许递归别名,还允许定义关键字别名。
4.执行大括号扩展,例如,a{b,c}变成ab ac。
5.如果~位于单词的开头,使用用户的主目录替换。
6.对任何以符号$开头的表达式执行参数替换。
7.对形式$(string)的表达式进行命令替换。
8.评估形式为$((string))的算术表达式。
9.把行的参数、命令和算术替换部分再次分成单词。这次它使用$IFS中的字符做分隔符而不是步骤1中的元
字符集。
10.对出现的*、?和[ / ]对执行路径名扩展,也称为通配符扩展。
11.查找其他源码,使用第一个单词作为命令,首先是一个function命令,然后是一个内置命令,然后是
$PATH内目录里的文件。
12.设置完I/O重定向和其他操作后执行该命令。
此步骤列表很直接,但还不是全部内容,有几种修改该过程的方式:使用引用,使用command,builtin或enable,
以及使用高级命令eval。


1.引用

可以将引用看成shell忽略上面12个步骤中某些步骤的一种方式。特别是:
单引号绕过了前10个步骤。
双引号绕过了步骤1到步骤5,步骤9和步骤10.也就是,在双引号内忽略了管道字符、别名、~替换、通配符扩展和
通过分隔符分裂成单词。双引号内的单引号也没有作用。可以在双引号内包含双引号,方式是在前面加上反斜杠。


2.command、builtin和enable

command不查找别名、关键字和函数,只有所有路径中找到内置命令和PATH中的命令被执行。
例如:
cd()
{
	#some process
	command cd
}
这里要避免函数陷入递归循环中。方法是把command放在cd前面,确保内置命令cd被执行,而不是函数被调用。

builtin类似于command,但更加严格。它只查找内置命令。上面的例子也可以使用builtin。

enable用于屏蔽一个内置命令。
使用enable -a显示所有的命令(可用和不可用)
使用enable显示所有可用的内置命令。使用enable command可以使一个命令可用。
使用enable -n可以显示所有被屏蔽的内置命令,使用enable -n command可以屏蔽一个命令。
例如:
[[email protected] ~]# enable
enable .
enable :
enable [
[省略]

enable cd

[省略]

[[email protected] ~]# enable -n cd
[[email protected] ~]# enable -n
enable -n cd

[[email protected] ~]# enable -a
enable .
enable :
enable [
[省略]

enable -n cd

[省略]

[[email protected] ~]# cd /dev
-bash: cd: command not found
[[email protected] ~]# enable cd
[[email protected] ~]# cd /dev/
[[email protected] dev]#


3.eval

eval语句通知shell接收eval参数,并再次通过命令行处理的所有步骤运行它们。例如下面的脚本a.sh:

var1="ls | less"$var1

执行结果为:

# ./a.shls: |: No such file or directoryls: less: No such file or directory

原因是:

对照上面命令执行的步骤,首先执行的是第6步:对任何以符号$开头的表达式执行参数替换,然后继续执行下面的步骤,

而命令中的管道符一直都没有机会被解析,最后作为ls的参数进行执行,导致错误。

正确的脚本应该是:

var1="ls | less"eval $var1

原因是:

首先执行的是第6步:对任何以符号$开头的表达式执行参数替换,然后继续执行下面的步骤,最后在运行命令时判断到
是eval,回到第一步继续执行,此时管道符被解析,最终命令成功被执行。

《学习bash》笔记--命令行处理,布布扣,bubuko.com

时间: 2024-10-29 19:10:38

《学习bash》笔记--命令行处理的相关文章

Linux 程序设计学习笔记----命令行参数处理

转载请注明出处.http://blog.csdn.net/suool/article/details/38089001 问题引入----命令行参数及解析 在使用linux时,与windows最大的不同应该就是经常使用命令行来解决大多数问题.比如下面这样的: 而显然我们知道C语言程序的入口是mian函数,即是从main函数开始执行,而main函数的原型是: int main( int argc, char *argv[] ); int main( int argc, char **argv );

Linux学习笔记--命令行下的常用快捷键

主要介绍Linux Bash Shell下的几个常用快捷键. 删除类快捷键: "ctrl + k" 删除光标后面所有字符 "ctrl + u" 删除光标前面所有字符 "ctrl + w" 删除光标前一个单词 "ctrl + y" 恢复"ctrl+k"."ctrl+u"."ctrl+w"等上次执行时删除的字符 "ctrl + ?" 撤消前一次输入 移

Standford Parser学习入门(2)-命令行运行

在Stanford parser目录中已经定义了一部分命令行工具以及图形界面,本文将介绍如何在windows使用这些工具进行语法分析,Linux下也有shell可以使用. 关于如何搭建环境请参考上一篇文章:Standford Parser学习入门(1)-Eclipse中配置 在解压目录中,打开命令窗口,运行lexparser.bat,会得到如下结果,即为命令行方式运行结果. 运行 lexparser-gui.bat,可弹出图形界面如下图,先点击Load Parser选择model文件(本例中用s

zookeeper学习:使用命令行连接到服务器

其实学习zookeeper挺简单的,找一本书或者网上的资源,按照其中的例子做一遍就大致了解了.之前是自己学习的方法有问题. 1. 会启动单机版的服务器,并使用客户端连接,然后进行节点的各种操作 2. 会启动zookeeper集群,并用客户端连接,会看懂对应的启动和连接日志 3. zookeeper客户端的会话周期知道一点 4. 利用zookeeper集群在命令行工具下实现一个主从模式 5. 知道永久节点和临时节点的区别 6. zookeeper中并没有直接实现锁,而是提供了能够实现锁的原语.了解

1.4 Bash的命令行展开和Bash环境的配置

使用read命令来接受输入 使用read来把输入值分配给一个或多个shell变量 -p 指定要显示的提示 -s 静默输入,一般用于密码 -n N 指定输入的字符长度N -d '字符' 输入结束符 -t N TIMEOUT为N秒 read 从标准输入中读取值,给每个单词分配一个变量 所有剩余单词都被分配给最后一个变量 read -p "Enter a filename: " FILE bash如何展开命令行 1.将命令行传入bash. 2.解析引用分割为单个单词: shell中有3种引用

GITHUB中GIT BASH基础命令行

在github上已经注册了账号. 特别注意: 括号内均为提示信息 1.常用命令行工具: ①cmd ②powershell ③git bash 2.命令行常用命令(在git bash上生效,部分在cmd无用) ? -pwd (print working directory) 查看当前所在路径--绝对路径 ? -cd(change directory) 切换目标 ? -ls(list) 查看当前目录下的内容 ? -mkdir(make directory) 创建目录 ? -touch 创建文件 ?

Bash终端命令行,使用privoxy将socks代理转成http代理

安装privoxy # Ubuntu/debian sudo apt-get install privoxy # Centos sudo yum install privoxy # Mac osx sudo port install privoxy 修改配置文件 vi /etc/privoxy/config # HTTP parent looks like this: # forward-socks4 / 127.0.0.1:1080 . # # To chain Privoxy and Tor

【linux使用】bash shell命令行常用快捷键 (转载)

移动: Ctrl + A: 移动到当前编辑的命令行首, Ctrl + E: 移动到当前编辑的命令行尾, Ctrl + F 或 ->:按字符右移(往命令行尾部方向,前移) Ctrl + B 或 <-:按字符左移(往命令行尾部方向,后移) Alt + F: 按单词右移 (往命令行尾部方向,前移) Alt + B: 按单词左移(往命令行首部方向,后移) 编辑: Ctrl + C: 删除整行 Ctrl + L: 清屏,相当于clear Ctrl + U: 简介光标位置到行首的内容(包括自身),以后可用

转载---Python模块学习optparse 处理命令行参数

参考资料 http://docs.python.org/library/optparse.html 原文地址 http://mrwlwan.wordpress.com/2008/09/25/python%ef%bc%9a-%e4%bd%bf%e7%94%a8-optparse-%e5%a4%84%e7%90% Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强