您的位置:首页 > 运维架构 > Shell

linux_shell笔记(三)

2010-03-27 11:47 113 查看
命令行:当在命令提示符后输入命令并按

ENTER

键后,
shell

将执行相应的程序。包括命令和参数的行称为命令行。

Command [arg1]
[arg2] [arg3]....[argn] RETURN

命令行上采用一个或多个空格来隔开每个元素。
arg
为参数,方括号表明被括起来的参数为可选项。选项是一种特殊类型的参数,其前面通常是一个或两个连字符。参数都有编号,其中命令本身作为参数
0
,它是命令行参数的开始。选项是改变命令执行效果的参数,选项与特定的程序相关,并由命令行上调用的程序解释,而不是
shell
解释。按照约定,选项是跟在命令之后其他参数之前的单独参数。多数命令的选项前面需要带一个连字符,这个要求是与工具相关的,而与
shell
无关。
GNU
选项前面通常带两个连字符(
--help
)。当需要多个选项时,可将多个单字符组合成一个参数,以一个连字符开始,在选项间不要加空格。这样合并后的选项之前不能使用两个连字符。

Df

disk
free
的简写。

>df -h

>ls -lh

选项
'-h'
显示可读文件的大小,以千字节
兆字节或千兆字节的方式显示文件大小。

df

report
file system disk space usage
,显示参数给定文件所在的文件系统的信息,默认是显示所有文件系统。

>su

>fdisk -l

>exit

有些工具的选项也需要参数,如工具
gcc

'-o'
选项后必须跟
gcc
产生的可执行文件名。

>gcc -o
example example.c

工具的参数
(
如文件名
)
是允许以连字符开始的

>cd ~

>ls -l

上面命令行可以解释为显示文件
'-l'
,也可解释为给出工作目录下所有文件列表;
linux

选择后者。应该避免这种情况的出现,避免创建带连字符的文件名。一些命令约定使用
'--'
参数来表示选项的结束和参数的开始。

>ls -- -l

>ls ./-l

>pwd

>ls ~/-l

>ls -l -- -l

这些是约定而不是规定,有些工具并不支持。

注意于下列用法中的
'-'
的区别:

>cat
example.c – example2.c

>bunzip2 -c
example.tar.bz2 | tar -xvf -

处理命令行:当向命令行输入命令时,
linux

tty
驱动程序(
Linux

操作系统内核的一部分)将检查每个字符,来确定是否立即采取动作。例如
CONTROL


U

删除行键时,设备驱动程序将立即根据按键的功能要求调整命令行,当不需要立即采取行动时,设备驱动程序将把字符存储在缓冲区中,等待字符输入。当按
return

后,设备驱动程序将把命令行传递给
shell
处理。

分析命令行:当
shell
处理命令行时,它将命令行作为一个整体来对待,并将其区分为几部分。命令行中提示符后的第一项通常为命令名,因此
shell
将把命令行中从第一个字符到第一个空白字符之间的字符串作为命令名。命令名可以用简单的文件名或路径名的方式指定。

>pwd

>ls -l

>/bin/ls
-l


shell

并不要求程序名必须首先出现在命令行上,也支持

> >bb
aa< cat


标准输入来自文件
aa

标准输出到文件
bb
。当
shell
识别出重定向符后,它将在找到命令行调用的程序名前处理这些符号以及它们的参数。为程序的执行建立环境?

执行命令行:
shell
找到了与命令行上的命令具有相同名字的可执行文件,那么,
shell
将创建一个进程执行该可执行文件,并将命令行上的命令名
参数
选项传递给该进程,当命令执行时
shell
等待进程的结束,休眠状态。当程序执行完毕,就将退出状态传递给
shell
,这样
shell
就返回到活跃状态,显示提示符,等待下一个命令的输入。

shell
不处理进程的参数,只是将他们传递给调用的程序,所以
shell
不知道选项和参数是否对程序有效。所有关于选项和参数的错误消息和用法消息都是来自程序自身。

标准输出
是指程序输出信息的地方。程序本身并不知道他发送到标准输出的信息究竟要送往何处。

标准输入
是指程序信息的来源。程序同样也不知道信息的来源。

对一个运行的程序来说,除了具有标准输入和标准输出以外,通常还有错误消息输出,称为标准错误输出。

>bash

>bash

>exit

>exit

在命令提示符后
输入要使用的
shell
名(如
bash
tcsh
),然后
return
,则出现的提示符为新
shell
给出的。输入
exit
命令可退回到前一个
shell

shell
是嵌套的,所以只能从最初的
shell
注销。

设备文件驻留在
linux
文件系统中(通常位于目录
/dev
)用来代表外围设备,如终端模拟器窗口
显示屏 打印机和硬盘驱动器。

>who

>tty

每个打开的窗口都有对应的设备名。在这些窗口中运行
tty
工具即可得到他们各自的名称。通常把这个设备文件看作是一个文本文件进行读写,如屏幕上显示的内容被写入到该文件,键盘输入的内容从该文件中读取。

>cat

This is a line
of text

This is a line
of text

CONTROL-D

>


cat
后不带参数,那么
cat
将从标准输入获取输入,它把标准输入内容逐行地复制到标准输出。
CONTROL





D



EOF

信号,该信号表明标准输入结束,没有文本可复制。
若把某个文件名作为参数,那么
cat
将把该文件作为它的输入。

重定向是指改变
shell
标准输入来源和标准输出去向的各种方式。

通过重定向符

'>'
可以将
shell
命令的输出重定向到指定的文件而不再是屏幕。

Command [arg] >
filename

利用
cat
将标准输入关联到键盘,标准输出被关联到指定文件
example.c
。重定向可能覆盖原有文件,如果原文件存在则重写并覆盖。不存在则创建新文件。

>cat >
example.c

This is a line
of text

CONTROL – D

>cat
example.c

使用
cat
将一个或多个文件一个接一个地连接成一个较大文件:

>cd ~

>rm example*

>ls -l

>cat
>example.c

This is
example.c

CONTROL+D

>cat
>example1.c

This is
example1.c

CONTROL+D

>cat
>example2.c

This is
example2.c

CONTROL+D

>cat example*

>cat example*
>example3.c

>cat
example3.c

>ls -l

通过重定向符
'<'
可以使
shell
将命令的输入重定向为来自指定的文件而不再是键盘。重定向输入命令行格式:

command [arg] <
filename

>cat
example3.c

>cat
<example3.c


cat
的输入重定向到文件的执行结果与命令
cat
后跟文件名作为参数的执行结果相同。这种特性属于
linux
的一类工具,这类工具首先检查调用他们的命令行,如果命令行上存在文件名,那么这类工具就把指定的文件作为输入。否则将标准输入作为输入。这种特性是该类工具自身所有的,而与
shell
或者操作系统无关。

>cat
example1.c example2.c

>cat
example1.c example2.c > example1.c

>cat
example1.c example2.c

上面命令行
cat
报告错误信息,但
shell
再收到报告之前就覆盖了已存在文件
example1.c
的内容。命令执行后
example1.c

example2.c
内容相同,这是由于当
shell
遇到重定向符时
'>'
首先采取的动作是删除
example1.c
原来的内容。然后才是
cat
的执行。

>cat
example1.c example2.c > example4.c

>mv
example4.c example1.c

>cat
example1.c

>cat
example3.c>>example1.c

>cat
example1.c

使用
'>>'
追加符可以向某个文件末尾添加新的内容,并且不改变原来已有内容。为了避免不小心覆盖了原来已存在文件,最好还是在采用这种方式操作文件前对文件进行备份。

>date >
whoson

>cat whoson

>who >>whoson

>cat whoson

设备
/dev/null
是一个数据接收器,通常被称为位桶
(bit
bucket)
,可以将不想看见或者不想保存的数据重定向到
/dev/null
,这样输出数据不留痕迹地消失:

>echo 'Hello
linux' >/dev/null

>ls -l
example.c

>cat
example.c

>cat
/dev/null > example.c

>ls -l
example.c

>cat
example.c

>tty

>echo 'hello
linux' > /dev/pts/0

>who

>echo 'hello
pts/1' > /dev/pts/1

>cat
example.c > /dev/pts/1

管道:
linux
使用管道将一个命令的输出直接连接到另一个命令的输入。管道类似于下面的过程,首先将一个命令的标准输出重定向到一个文件,然后将该文件作为另一个命令的标准输入。管道不会单独处理每条命令,并且不需要中间文件。

Command_a
[arga] | command_b [argb]

上面命令得到的结果与下面结果相同:

command_a [arga]
> temp

command _b
[argb] < temp

rm temp

管道不仅可以简化输入,同时效率更高,因为他不会产生中间临时文件。

>ls -li |
grep example

>tar -cvf
all.tar example.c example2.c

>bzip2 -kv
all.tar

>tar -tvf
all.tar

>mkdir
example

>mv all*
example

>cd example

>ls -l

>tar -xvjf
all.tar.bz2


>bunzip2
-c all.tar.bz2 | tar -xvf -


>cd ..

>rm -r
example

>ls -l

任何
linux
工具都可以使用管道从命令行上指定的文件中接受输入,也可以从标准输入接受输入。有些使用管道的命令仅从标准输入接受输入。

Tr

只能从标准输入接受输入而不能从文件接受输入,管道是利用将两个命令的标准输入与输出进行互相关联工作,对每一个命令来讲,他并不知道标准输入是什么,他只是通过固定的文件描述符(有些系统叫文件句柄)来定义标准输入或标准输出。而不关心具体的标准输入或输出是什么,对于他来讲都将其看着一个普通文件而已。这里的重温件接受输入是指文件作为参数时?是工具本身的要求。

Tr string1
string2

在标准输入上查找与
string1
中字符匹配的字符,找到后将其替换为
string2
中对应位置的字符;并输出到标准输出上,
tr
是从标准输入获得输入,所以不能改变文件(如果将文件重定向到标准输入)内容。

>cat
example.c | tr abc ABC

>tr abc ABC <
example.c

>tr abc ABC

dagagawrhaja

CONTROL+D

>cat
example.c

上面上行命令:第一个利用管道将标准输入重定向到工具
cat
的标准输出,第二个利用重定向符将标准输入进行了重定向,第三个使用默认的标准输入。

Lpr
可以从文件接受输入也可从标准输入接受输入。

>ls >temp

>lpr <temp

>lpr temp

>rm temp

>ls | lpr

sort
可以从文件接受输入也可以从标准输入接受输入。

>who >temp

>sort <temp

>sort temp

>rm temp

>who | sort

>who | grep
‘terry’

>ls -li |
less

过滤器是将输入数据流处理后再输出数据流的一类命令。包括过滤器的命令行用一个管道将某个命令的标准输出连接到过滤器的标准输入,用另一个管道将过滤器的标准输出连接到另一个命令的标准输入。并不是所有工具都可用作过滤器。

>who | sort |
lpr

shell
可以组合多个
linux
工具来实现更强大的功能。其中的工具并不需要因为相互协作而进行特殊设计,他们都仍然按照约定使用标准输入和标准输出。通过
shell
对输入输出进行控制,用户可以在命令行将多个工具组合起来实现目标。

Tee

向两个方向输出,将标准输入复制到每个指定的文件和标准输出。它只有一个输入但是输出到两个方向。

>who | tee
who.out | grep terry

>cat who.out

>ls

前台:当前台运行命令时,
shell
将一直等到命令执行完毕,
shell
会给出提示符使用户可以继续输入下一个命令。当命令在后台运行时,不必等待该命令完成,就可以直接输入另一个命令。

作业:作业是指一个或者(可通过管道连接的)多个命令组成的序列。前台只能有一个作业位于窗口或者屏幕中,但是可以有多个作业在后台运行。

作业编号与
PID

如果命令行末尾输入与符号
&
后按
RETURN
键,那么
shell
将在后台运行这个作业,
shell
会为该作业分配一个作业号并显示该作业号,在作业号后显示进程标识号(
PID
)。

>gedit
example.c &

>xclock &

>jobs

>fg %1

CONTROL+Z

>bg %1

>fg %2

CONTROL+C

>jobs

>kill %1

>jobs

CONTROL+Z

程序挂起键,
shell
将把前台的作业挂起,并终止作业中的进程,将作业的标准输入与键盘断开。用
bg
命令后跟作业编号可以将挂起作业放到后台运行。

只有前台作业可以从键盘获得输入。为了将键盘和后台某个正运行的作业连接起来,必须把该后台作业移到前台。输入

fg

(或者%)后跟作业编号可以将对应作业移到前台运行。

为了避免后台作业干扰前台作业,可以将后台作业的输出重定向。

命令行上输入
kill
后跟进程的
PID
号(或者后跟%和作业编号),可以将后台正运行的进程(或作业)终止。使用中断键(

CONTROL



C

)不能实现后台作业终止

(

只能对前台作业有效

)

功能的。

>ps

>xclock &

>gedit &

>jobs

>ps | grep
gedit

>kill 12049

>ps

>jobs

>kill
%1

>ps

>jobs

>pstree

>ps -elf

如果忘记了某个进程的

PID

号,则可以使用

ps

工具来显示该编号。如果忘记了作业标号,可以使用

jobs

来显示作业编号列表。

通配符和通配:当输入包含特殊字符的部分文件名时,
shell
可以生成与已有文件的名字匹配的文件名。这些特殊的字符也常常称为通配符。当某个特殊字符作为参数出现在命令行上时,
shell
将该参数扩展为有序的文件名列表,并将列表传递给命令行上调用的程序。被调用程序并不知道是
shell
生成了文件名。

'?'
:
它与已有文件名中的某个单独字符匹配。

>touch
example.c example1.c example2.c example3.c example4.c

>ls -li
example*

>cat
example?.c

>echo
example?.c

>echo
example*

>cat example*

>echo *

>echo .*

'*'
:可以与文件名中任意多个(包括
0
个)字符匹配。

用方括号将一个字符列表括起来使得
shell
与列表中每个单独字符进行匹配。
example?
匹配
example
后跟任何一个字符文件名,而方括号更严格一些,
memo[17a]
仅与
memo1
memo7 memoa
匹配。

>echo
[aefgou]*

>less
page[2468].txt

>lpr example1
example2 example3 example4 example5 example9

>lpr
example[123459]

>lpr
example[1-5 9]

>lpr
example[0-9] example[12][0-9] example3[0-8]

>echo [a-m]*

>echo *[x-z]

>ls *[^ab]

>ls [b-d]*

>ls ?old

>ls /?old

将特殊字符进行转义,
shell
将不在将其看作特殊字符。大多数工具和程序不能翻译模糊文件的引用,该翻译工作由
shell
完成。

模糊文件引用由

shell

进行扩展,而不是由

shell

调用的程序进行扩展,

shell

对模糊文件引用进行扩展,并将扩展得到的文件列表传递工具。

echo

验证了这一点,因为它显示了参数而不是模糊文件引用


内置命令是放置在
shell
内的工具。每个
shell
都有自己的内置命令集合。当运行内置命令时,
shell
并不产生新的进程,这使得内置命令运行得很快,并且能影响当前
shell
的环境。
shell
总是在查找命令或者是工具之前执行
shell
内置命令。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: