lecture 6
命令别名:
例如:
alias cdnet='cd /etc/sysconfig/network-scripts'
unalias cdnet 撤销别名的
别名只是对当前的shell有用,想要保存,就要保存到用户的个人环境配置文件中去
\ ---->转义字符,例如,touch \*.txt 创建*.txt这个文件,如果 touch *.txt 这是直接修改任何以txt结尾文件的时间戳
写脚本程序
命令的堆叠、循环、选择、控制
创建一个脚本很简单,只需要写一个文本文件,这个文件的第一行要以#!开头,并指明shell的类型
如:
1
#!/bin/bash --->说明这是一个bash脚本,用以界定是用什么shell来对脚本程序进行解释,否则是无法运行的,因为我们制定的命令都是以2进制文件的形式运行并调用内核中对应命令的API来实现命令的真正实现,而脚本程序多是文本文件,多以中间需要转换并解释。
详细的解析在121102
2
一旦,脚本程序写完,脚本的名称就是一条命令
,所以输入脚本名称的时候就相当于执行了一次命令,而在执行命令的时候是和$PATH有关系的,是要在$PATH中找这条命令的,
例如你在/root目录中写下了 a.sh 这个文件,在、root目录中执行这条命令是行不通的,因为$PATH中没有指定/root,所以也就是不会在/root中去找a.sh这条命令。要想执行a.sh这个脚本 方法一:将a.sh放到$PATH中指定的目录当中去。方法二:在输入a.sh前加上 ./ 这表示在当前目录下寻找a.sh这个脚本
3
命令追踪1
为了便于我们在之子执行我们的脚本时,我们可以在脚本中加入 set -x
如:/root/a.sh
#!bin/bash
set -x ------->一下的命令每执行一条都要被追踪
ls /etc
echo $PATH
set +x -------->停止追踪
命令追踪2
我们也可以在执行脚本a.sh时
# bash -x a.sh ----->这样也能实现命令的追踪
但是,这时的a.sh 不是命令,而是执行bash -x a.sh ,这里的a.sh是一个参数传给bash,并且a.sh这个文件是不需要执行权限的 -x仅仅是选项
4
如果你想用perl脚本
#/usr/bin/perl ----->解释器是可以发生变化的,这表示用perl解释器
5
记住我在/root下写的a.sh b.sh c.sh d.sh my.sh mycp.sh 这几个脚本程序的格式方法
并详见linux-unix 2后面的一部分内容
lecture 7
standard I/O and pipes 标准I/O和管道
输入输出系统,所有计算机部件都是通过总线<bus>来实现的
总线<bus>类型有:PCI ISA EISA AGP USB
不同总线用于来接不同的外围设备的,这些总线都是通过 桥<南桥、北桥> 来相互连接、交互起来的
程序:对于程序而言<代码> 数据是要被操作的对象,还有操作完成后数据往什么地方去。
我们的输入设备有键盘、鼠标、扫描仪。我们的输出设备是现实器、音响、打印机,在你不定义默认的输入输出的时候,这些设备都是可以做默认的输入输出设备的。默认输入、默认输出在操作系统初始化的时候就已经定义好了,但是在linux中不叫默认输入输出,而是叫标准输入输出,此外还要有标准错误输出。错误输出和输出是两个不同的数据流。不过在现代操作系统中,错误输出和输出都被定义在代价很低的显示器上,而标准输入则是定义在键盘上
例子:
标准输出
# ls -al /etc
named.conf vsftpd --->这是标准输出
# ls -l /ect
ls:/ect:No such file or directory ----->这是标准错误输出,这不是命令的正常执行结果
注意:以上两个输出的数据流是不一样的
1
重定向<I/O重定向>
有时候我们不想从标准输入读取数据,也不想将结果从标准输出输出出去,或标准错误输出输出到标准输出上这时,我们就要用到重定向
标准输入: 用0表示 一般可以省略
标准输出: 1 一般可以省略
标准错误输出: 2 不可省略
1 > 输出的重定向
2 2> 标准错误输出重定向
3 &> 无论是正确的输出还是错误的输出都是一样的重顶向
4 < 输入的重定向
5 >| 输出重定向,并可强制覆盖
6 >> 追加输出重定向,不覆盖,会在文件末尾添加重定向后的内容
7 2>> 标准错误输出追加重定向
8 << here document 可以在脚本中生成文件,可以在一个脚本中,往一个文本文件中输入内容的
例子:
创建/tmp/my.txt文件,并用非交互式的方式向/tmp/my.txt文件中输入内容<vim\nano都是交互式的>
在命令行中
# cat >> /tmp/my.txt << EOF {向/tmp/my.txt中输入内容,遇到EOF结束}
> This is a file
> EOF
# ls /tmp
abc buildscript ls.out ls.out2 my.txt
# cat my.txt
This is a file
#
在脚本中
# nano createfile.sh
createfile.sh 如下
#!/bin/bash
cat >> /tmp/my2.txt << EOF
haha ,you fool
EOF ---->EOF是结束符
# chmod u+x createfile.sh
# ./createfile.sh 执行一下文件
# ls /tmp
abc buildscript ls.out ls.out2 my2.txt my.txt
# cat /tmp/my2.txt
haha,you fool
#
这就在脚本程序中创建了/tmp/my2.txt并且给my2.txt中输入了内容
9 2>&1 = &>
例子:
# ls /etc >/tmp/ls.correct 2>&1
这条命令的意思就是"ls /etc"这条命令执行正确后就放在/tmp/ls.correct 而错误时还是要放到/tmp/ls.correct 因为1代表真确的标准输出
我们的linux上一切都是文件,这三种输入输出也是一样的,标准输入、标准输出、标准错误输出也是文件,在linux中每打开一个文件都是要首先打开一个文件描述符的东西--文件句柄<handle>,我们的这三种 输入输出文件也是要有文件句柄的。
标准输入: 用0表示
标准输出: 1
标准错误输出: 2
例子:
1 # cat < /etc/issue
Redhat Enterprise Linux Server Release 5.3(Tikanga)
kernel \r on an \m
这里我的标准输入就被重定向,不在从键盘上读取数据,而是从一个文件中读取
2 # ls /etc > /tmp/ls.out
# cat tmp/ls.out
这里就会发现ls /etc的所显示的内容就放在 /tmp/ls.out文件中
3 # ls -l /ect
ls:/ect:No such file or directory
# ls -l /ect > /tmp/ls.out2
ls:/ect:No such file or directory
# ls -l /ect 2> /tmp/ls.out2
# cat /tmp/ls.out2
ls:/ect:No such file or directory
# ls -l /etc 2> /tmp/ls.out2
a2ps.cfg cron.weekly gpm-root.conf
……等等
这里就是重定向了一个错误输出 要使用 "2>",
但是如果是想最后一条命令"ls -l /etc 2> /tmp/ls.out2" 输入正确了,则" 2>/tmp/ls.out2"就没有用了,则依旧会显示出/etc下目录中的内容
同时我们的重定向还是覆盖的重定向,就是我们重定向的文件中有内容,就会将其覆盖掉 ,如果不想被覆盖,则在重定向语句之前加上命令"set -C"
例子:
# set -C
# ls -l /ect 2> /tmp/ls.out2
-bash:/tmp/ls.out2:cannot overwrite existing
file
# set +C
# ls -l /ect 2> /tmp/ls.out2 覆盖掉了
# set -C
# ls -l /etc >| /tmp/ls.out2 这时可以强制覆盖
4 例子:
# ls /etc/ > /tmp/ls.correct 2> /tmp/ls.error
这个命令的意思就是,如果" ls /etc/ "命令正确了就输入到/tmp/ls.correct,错误了就输入到/tmp/error
自定义一个文件描述符
0 是标准输入
1 是标准输出
2 是标准错误输出
3~9用户是可以自定义的 exec来实现
例子:
我想让3表示一个文件,以后向3里面输入内容就是保存在文件里面去的
# exec 3> /tmp/custom.out
# ls -l /etc >&3
这样“ls /etc”的内容就存在/tmp/custom.out
注意:自定义文件描述符不用后要将其关闭
如,将上面的3关闭了
# exec 3>&-
#
这就将3给关闭了,否则/tmp/custom.out会一直处于打开状态,一直打开的文件是占用内存空间的
自定文件描述符的意义在于:
# ls /etc > /tmp/a.out
# ls /var >> /tmp/a.out 方法一 a
# ls /home >> /tmp/a.out
# exec 3> /tmp/a.out
# ls /etc >&3
# ls /var >>&3 方法二 b
# ls /home >>&3
用a 就会每次向a中输入内容时都要打开一次/tmp/a.out并且要关闭一次tmp/a.out
而方法二 b 前后的三次输入只需打开一次b并在没有给出命令"exec 3>&-"时,/tmp/a.out是一直处于打开的状况
管道
用竖线"|"表示,linux哲学思想:每个程序之作或完成简单的工作,如果要完成复杂的工作就要把他们组合起来。
所以管道就是用来连接这些不同的简单任务的,并且是这个程序或命令的输出是下一个命令或程序的输入,但最后的命令或程序是在子shell中运行的,所以在前面命令中所引用的变量在最后一条命令中是无法运用的。
例子:命令tr 是用来将第一个列表中指定的字符集换成第二个列表中指定的字符集
如 # tr 'a-z' 'A-Z'
# echo 'abcd' | tr 'a-z' 'A-Z'
ABCD --->就是将abcd换成ABCD
#
如果你要是想用管道完成将第一个命令的输出A作为第二个命令的输入,同时还想保留一份A ,这是我们就需要用tee命令
例子
# echo "abcd" | tee /tmp/tee.out | tr 'a-z' 'A-Z'
ABCD
# cat /tmp/tee.out
abcd
这个就是保留一份第一条命令的输出abcd到文件/tmp/tee.out