实验报告
日期: 2015年9月15日
一、实验的目的与要求
熟练地使用 Linux,本实验介绍 Linux 基本操作,shell 环境下的常用命令。
二、主要内容
1.Linux 基础入门& 2.基本概念及操作
认真看过这篇linux系统简介文章,对于这样一个免费、高效的操作系统有了一个初步的认识。希望能在本学期对于linux操作系统有很好的认识和操作,使用。 同时,对于新认识的一些历史中开发和修复各个操作系统的前辈表示深深地敬佩。
2.
基本概念及操作
主要过程:
(1)实验楼环境介绍
(2)常用 Shell 命令及快捷键
按键 | 作用 |
---|---|
Ctrl+d |
键盘输入结束或退出终端 |
Ctrl+s |
暂定当前程序,暂停后按下任意键恢复运行 |
Ctrl+z |
将当前程序放到后台运行,恢复到前台为命令fg
|
Ctrl+a |
将光标移至输入行头,相当于Home 键 |
Ctrl+e |
将光标移至输入行末,相当于End 键 |
Ctrl+k |
删除从光标所在位置到行末 |
Alt+Backspace |
向前删除一个单词 |
Shift+PgUp |
将终端显示向上滚动 |
Shift+PgDn |
将终端显示向下滚动 |
Shell 常用通配符:
字符 | 含义 |
---|---|
* |
匹配 0 或多个字符 |
? |
匹配任意一个字符 |
[list] |
匹配 list 中的任意单一字符 |
[!list] |
匹配 除list 中的任意单一字符以外的字符 |
[c1-c2] |
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
{string1,string2,...} |
匹配 sring1 或 string2 (或更多)其一字符串 |
{c2..c2} |
匹配 c1-c2 中全部字符 如{1..10} |
(3)Linux 使用小技巧
man 手册区段 | 说明 |
---|---|
1 | 一般命令 |
2 | 系统调用 |
3 | 库函数,涵盖了C标准函数库 |
4 | 特殊文件(通常是/dev中的设备)和驱动程序 |
5 | 文件格式和约定 |
6 | 游戏和屏保 |
7 | 杂项 |
8 | 系统管理命令和守护进程 |
(4)使用以下代码输出图形字符
$ sudo apt-get update;sudo apt-get install sysvbanner toilet figlet
$ banner feels good
$ toilet feels good
$ figlet feels good
3.用户及文件权限管理
(1)查看用户
who [options] [files]
参数 | 说明 |
---|---|
-a |
打印能打印的全部 |
-d |
打印死掉的进程 |
-m |
同am i ,mom likes
|
-q |
打印当前登录用户数及用户名 |
-u |
打印当前登录用户登录信息 |
-r |
打印运行等级 |
(2)创建用户
sudo adduser 【name】
指令:adduser = add user
add :添加
user:用户
(3)用户组
方法一:使用groups命令
例子:groups shiyanlou
方法二:查看/etc/group文件
例子:cat /etc/group | sort
注:如需要命令过滤则 cat /etc/group | grep -E "shiyanlou|sudo"
etc/group 文件格式说明
(4)将其它用户加入 sudo 用户组
例子:sudo usermod -G sudo lilei
指令: usermod = user mod
user : 用户
mod : 模型
(5)删除用户
例子:sudo deluser lilei --remove-home
指令: deluser = del user、 remove
del user :删除用户
remove:删除
(6)查看文件权限
- 显示所有文件大小,并以普通人类能看懂的方式呈现:
$ ls -AsSh
查看某一个目录的完整属性,而不是显示目录里面的文件属性:
$ ls -dl <目录名>
(7)修改文件权限:
- 方式一:二进制数字表示
- 加减赋值操作。
作业:
4.Linux 目录结构及文件基本操作
(1)Linux 目录结构
Linux 是以树形目录结构的形式来构建整个系统的,可以理解为一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的,但从逻辑上来说 Linux 的磁盘是“挂在”(挂载在)目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统。
1.FHS 标准(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准)
FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。
FHS 定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该要放置设置文件,/bin 与 /sbin 则应该要放置可执行文件等等。
第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件、/usr/share 放置共享数据等等。
2.目录路径
路径
使用 cd 命令可以切换目录,在 Linux 里面使用 . 表示当前目录,.. 表示上一级目录, - 表示上一次所在目录,~ 通常表示当前用户的"home"目录。使用 pwd 命令可以获取当前所在路径(绝对路径)。
(注意,以 . 开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用 ls -a 命令查看隐藏文件)
绝对路径:以根"/"目录为起点的完整路径,以你所要到的目录为终点,表现形式如: /usr/local/bin
相对路径:相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录 . 为起点,以你所要到的目录为终点,表现形式如: usr/local/bin (这里假设你当前目录为根目录)。
提示:在进行目录切换的过程中请多使用 Tab 键自动补全,可避免输入错误,连续按两次Tab可以显示全部候选结果
(二)Linux 文件的基本操作
1.新建空白文件
使用 touch 命令创建空白文件,关于 touch 命令,其主要是来更改已有文件的时间戳的,但其在不加任何参数的情况下,只指定一个文件名,则可以创建一个为指定文件名的空白文件。
例子:touch test
新建目录
使用 mkdir(make directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性。
使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录(这在有时候安装软件,配置安装路径时非常有用):mkdir -p father/son/grandson
2.复制文件
使用cp(copy)命令复制一个文件或目录到指定目录。
如:cp test father/son/grandson
复制目录
如果直接使用cp命令,复制一个目录的话,会出现如下错误:
要成功复制目录需要加上-r或者-R参数
如:cp -r father family
3.删除文件
使用rm(remove files or directories)命令,删除一个文件或目录;
如:rm test
有时候你会遇到想要删除一些为只读权限的文件,直接使用rm删除会显示一个提示,就需要用上参数 -f ;
如:rm -f test
删除目录
跟复制目录一样,要删除一个目录,也需要加上-r或-R参
如:rm -r family
4.移动文件与文件重命名
使用mv(move or rename files)命令,移动文件(剪切)。
格式:mv 源目录文件 目的目录
如:mv file1 Documents
重命名文件
格式:mv 旧的文件名 新的文件名
如:mv file1 myfile
5.查看文件
标准输入输出:当我们执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),默认对应终端的键盘; 标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应被重定向到终端的屏幕,以便我们能直接看到输出内容。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
6.查看文件类型
如:file /bin/ls
7.编辑文件
Linux和Windows都用vim+gcc
5.环境变量与文件查找
(1)变量定义
#定义变量
declare $变量名
#或者直接赋值也自动定义变量,注意变量之前不带"$"
变量名=值
#打印变量的值,"$"代表引用变量的值
echo $变量名
在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。
通常我们会涉及到的环境变量有三种:
- 当前 Shell 进程私有用户自定义变量,如上面我们创建的 temp 变量,只在当前 Shell 中有效。
- Shell 本身内建的变量。
- 从自定义变量导出的环境变量。
-
输出环境变量set
| 显示当前 Shell 所有环境变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量 -
env
| 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行 -
export
| 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量
#将普通变量输出为环境变量,能被子进程继承
export 变量名
#比较文件的命令
vimdiff 1.txt 2.txt 3.txt ....
(2)命令的查找路径与顺序
PATH环境变量设置命令搜索路径
#输出当前命令搜索路径的设置
echo $PATH
#./程序名 表示执行当前目录下的指定程序
PATH中临时添加自定义路径,用冒号连接路径
PATH=$PATH:/home/shiyanlou/Code
如果永久添加需要修改配置文件 zsh是.zshrc bash是.bashrc 本次修改用户目录下的文件
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
(3)变量修改
变量的修改有以下几种方式:
变量设置方式 | 说明 |
---|---|
{变量名#匹配字串} |
从头向后开始匹配,删除符合匹配字串的最短数据 |
{变量名##匹配字串} |
从头向后开始匹配,删除符合匹配字串的最长数据 |
{变量名%匹配字串} |
从尾向前开始匹配,删除符合匹配字串的最短数据 |
{变量名%%匹配字串} |
从尾向前开始匹配,删除符合匹配字串的最长数据 |
{变量名/旧的字串/新的字串} |
将符合旧字串的第一个字串替换为新的字串 |
{变量名//旧的字串/新的字串} |
将符合旧字串的全部字串替换为新的字串 |
(4)变量删除
可以使用unset
命令删除一个环境变量:
unset temp
(5)让环境变量立即生效
source .zshrc
或者
. ./.zshrc
注意第二种方式必须指定完整的绝对或相对路径
(6)搜索文件
与搜索相关的命令常用的有如下几个whereis
,which
,find
,locate
。
- whereis搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。
whereis
只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。
-
locate,
通过"/var/lib/mlocate/mlocate.db"数据库查找,系统会使用定时任务每天自动执行updatedb
命令更新一次该数据库,有时需要手动执行一次updatedb
命令将新的文件数据添加进数据库,它可以用来查找指定目录下的不同文件类型,可以递归子目录进行查找,如查找 /etc 下所有以 sh 开头的文件:
$ locate /etc/sh
$ locate /home/shiyanlou/Code/\*.txt
经测试好像locate 后面要跟绝对路径,另外""必须用\来转义
-c 是仅统计数目 -i 是不区分大小写
which
它只从PATH
环境变量指定的路径中去搜索命令
which man
#查找系统中所有文件名中含D且在第三位的.txt文件
find / -name \?\?D\*.txt
#显示结果含有权限不够的信息,可以如下屏蔽
find / -name \?\?D\*.txt 2>/dev/null
#还可以加sudo执行
#另外,文件名加引号,可以直接用?或*,不用转义
#查找大小在10k-20k之间的*.txt
find / -name '*.txt' -size +10k -size -20k#查找空目录和空文件
find . -empty
#查找实验楼组的文件
find . -group shiyanlou
#在/tmp目录中查找大于100000000字节并且在48小时内修改的某个文件
find /tmp -size +10000000c -and -mtime +2
#在/tmp目录中查找所有不属于panda的文件
find /tmp ! -user panda
#查找属于shiyanlou用户的文件并显示文件信息
find . -user shiyanlou -ls
#删除找到的*.txt
find . -name '*.txt' -exec rm {} \;
#以上 \; 是为了转义;字符
6.文件打包与解压缩
(1)常用压缩包文件格式
- *.zip zip程序打包压缩的文件
- *.rar rar程序压缩的文件
- *.7z 7zip程序压缩的文件
- *.tar tar程序打包,未压缩的文件
- *.gz gzip程序(GNU zip)压缩的文件
- *.xz xz程序压缩的文件
*.bz2 bzip2程序压缩的文件
- *.tar.gz tar打包,gzip程序压缩的文件
- *.tar.xz tar打包,xz程序压缩的文件
- *tar.bz2 tar打包,bzip2程序压缩的文件
- *.tar.7z tar打包,7z程序压缩的文件
(2)zip压缩打包命令
- 压缩打包:
zip -r -【(1~9)压缩级别,1为快速打包,包体积大,9耗时长,体积小】-q -o 压缩包名 目录路径
-r:地鬼打包子目录全部内容
-q:安静模式
-o:输出文件,其后紧跟打包输出文件名 - 查看打包后文件大小 du -h 文件名du -h -d 0 *.zip ~ | sort分别查看多个.zip
-h --human readable
-d --max-depth - 创建加密zip包 zip -r -e -o 压缩包名 路径
- windows采用CR+LF换行,LINUX采用LF换行,为了使在LINUx压缩的包在windows上兼容,压缩时采用:
zip -r -l -o 压缩包名 路径
-l将LF转换为CR+LF
(3)解压zip包
- 使用unzip命令:unzip XX.zip
- 将文件解压到指定目录: unzip -q xx.zip
-d 目录名 - 不解压仅仅查看: unzip -l xx.zip
- windows中文采用GBK编码,LINUX相爱用UTF-8,解决解压的兼容问题,解压是指定采用编码类型:
unzip -O GBK 中文压缩文件.zip
(4)rar打包压缩命令
- rar压缩命令: rar命令没有参数-
参数a:rar a xx.rar 添加一个目录~到xx.rar
参数d:rar d xx.rar 文件名 从xx.rar删除文件
l:rar l xx.rar 查看不解压 - unrar解压命令 x:unrar x xx.rar 全路径解压
e:unrar e xx.rar 目录 解压到指定目录
(5)tar打包工具
-c:创建一个tar包文件
-f:指定创建的文件名
-v:非安静模式
tar -cf shiyanlou.tar ~
-x:解压一个tar
-C:解压到指定路径的已存在目录
tar -xf xx.tar -C 目录
-t:只查看不解包
tar -tf xx.rar
-p:保存文件属性
-h保存设备连接指向的源文件
tar -cphf xx.tar 要压缩目录
-z:.tar.gz
-J:tar.xz
-j:tar.bz2
(6)作业
install libaa-bin
install aafire
aafire
7.Linux 目录结构及文件基本操作
(1)目录
$ cd .. #进入上一级目录
$ cd ~ #进入home目录
$ pwd #查看当前目录
$ cd /usr/local/bin #绝对目录
$ cd ../../usr/local/bin #相对目录
(2)新建
$ touch test #新建一个test空白文件
$ mkdir mydir #新建一个mydir空目录
$ mkdir -p father/son/grandson #使用-p同时创建一个多级目录
(3)复制
$ cp test father/son/grandson #将test文件复制到/home/shiyanlou/father/son/grandson目录中
$ mkdir family
$ cp -r father family #将father目录里的所有包含子目录,复制到family
(4)删除
$ rm test #删除test文件
$ rm -f test #强制删除test文件
$ rm -r family #删除family目录
(5)移动文件
mv 源目录文件 目的目录文件
$ mkdir Documents
$ touch file1
$ mv file1 Documents #将file1移动到Documents目录
重命名 mv 旧的文件名 新文件名
$ mv file1 myfile #将file1重命名为myfile
$ touch file{1..5}.txt #使用通配符创建五个文件
$ rename 's/\.txt/\.c/' *.txt #将五个后缀 .txt 重命名 .c 为后缀
$ rename 'y/a-z/A-Z/' *.c #批量将五个文件的文件名大写
(6)查看文件
使用cat(正序) 、tac(倒序) 、nl命令查看文件,
$ cp /etc/passwd . #从etc目录下拷贝passwd文件
$ cat -n passwd #打印passwd内容,-n显示行号
$ head /etc/passwd #head显示头十行
$ tail /etc/passwd #tail 显示尾十行
$ head -n 1 /etc/passwd #只显示第一行
$ tail -n 1 etc/passwd #只显示最后一行
(7)查看文件类型
$ file /bin/ls
8.命令执行顺序控制与管道
(1)命令执行顺序的控制
a.顺序执行多条命令
顺序执行多个任务用 ; 号
-例如$ touch test;echo "hehe" >> test;cat test
b.有选择的执行命令
- 从$?环境变量获取上一次命令的返回结果
$ echo $?
$ [order1] && [oder2] #当[order1]的返回值==0,执行[order2]
$ [order1] || [orser2] #当[order1]的返回值!=0,执行[order2]
(2)管道
a.试用
例如将'$ ls -al /etc'的输出输出到less中查看
- '$ ls -al /etc | less'
b.cut 命令,打印每一行的某一字段
打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录:
-
$ cut /etc/passwd -d ':' -f 1,6
打印/etc/passwd文件中每一行的前N个字符:
# 前五个(包含第五个) $ cut /etc/passwd -c -5
# 前五个之后的(包含第五个) $ cut /etc/passwd -c 5-
# 第五个 $ cut /etc/passwd -c 5
# 2到5之间的(包含第五个) $ cut /etc/passwd -c 2-5
c.grep 命令,在文本中或 stdin 中查找匹配字符串
grep命令的一般形式为:
grep [命令选项]... 用于匹配的表达式 [文件]...
例子
- 1:搜索/home/shiyanlou目录下所有包含"shiyanlou"的所有文本文件,并显示出现在文本中的行号:
$ grep -rnI "shiyanlou" ~
-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件。 - 2: 查看环境变量中以"yanlou"结尾的字符串
$ export | grep ".*yanlou$"
其中$就表示一行的末尾。
d. wc 命令,简单小巧的计数工具
wc 命令用于统计并输出一个文件中行、单词和字节的数目,比如输出/etc/passwd文件的统计信息:
$ wc /etc/passwd
- 分别只输出行数、单词数、字节数、字符数和输入文本中最长一行的字节数:
# 行数 $ wc -l /etc/passwd
# 单词数 $ wc -w /etc/passwd
# 字节数 $ wc -c /etc/passwd
# 字符数 $ wc -m /etc/passwd
# 最长行字节数 $ wc -L /etc/passwd
e.sort 排序命令
-将输入按照一定方式排序,然后再输出
- 默认为字典排序:
$ cat /etc/passswd | sort
- 反转排序:
$ cat /etc/passwd | sort -r
- 按特定字段排序:
$ cat /etc/passwd | sort -t':' -k 3
上面的-t参数用于指定字段的分隔符,这里是以":"作为分隔符;-k 字段号用于指定对哪一个字段进行排序
f. uniq 去重命令
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq #因为uniq命令只能去连续重复的行,不是全文去重所以加上sort效果更佳
9.简单的文本处理
(1)文本处理命令
a.tr 命令
- tr 命令可以用来删除一段文本信息中的某些文字。或者将其进行转换。
使用方式:
$ tr [option]...SET1 [SET2]
常用的选项有:
- 选项 说明
-d 删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配
-s 去除set1指定的在输入文本中连续并重复的字符操作举例:
- 删除 "hello shiyanlou" 中所有的'o','l','h'
$ echo 'hello shiyanlou' | tr -d 'olh'
- 将"hello" 中的ll,去重为一个l
$ echo 'hello' | tr -s 'l'
- 将输入文本,全部转换为大写或小写输出 `$ cat /etc/passwd | tr '[:lower:]' '[:upper:]
'[:lower:]' '[:upper:]'你也可以简单的写作'[a-z]' '[A-Z]',当然反过来将大写变小写也是可以的`
b.col 命令
- col 命令可以将Tab换成对等数量的空格建,或反转这个操作。
使用方式:
$ col [option]
常用的选项有:
-选项 说明
-x 将Tab转换为空格
-h 将空格转换为Tab(默认选项)操作举例:
- 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号
$ cat -A /etc/protocols
- 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I 不见了
$ cat /etc/protocols | col -x | cat -A
c.join命令
- 将两个文件中包含相同内容的那一行合并在一起
使用方式:
$ join [option]... file1 file2
常用的选项有:
-选项 说明
-t 指定分隔符,默认为空格
-i 忽略大小写的差异
-1 指明第一个文件要用哪个字段来对比,,默认对比第一个字段
-2 指明第二个文件要用哪个字段来对比,,默认对比第一个字段
d.paste命令
paste这个命令与join 命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开。
使用方式:
$ paste [option] file...
常用的选项有:-选项 说明 -d 指定合并的分隔符,默认为Tab
-s 不合并到一行,每个文件为一行
操作举例:
$ echo hello > file1
$ echo shiyanlou > file2
$ echo www.shiyanlou.com > file3
$ paste -d ':' file1 file2 file3
$ paste -s file1 file2 file3
e.作业
1、#从dos 到unix文本格式转换
$ cat -A [dos] | tr -d '^M' | cat -A [dos]
-
2、sudo apt-get install ninvaders
10、数据流重定向
(1).简单的重定向
Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为
stdin(标准输入,对应于你在终端的输入)
stdout(标准输出,对应于终端的输出)
-
stderr(标准错误输出,对应于终端的输出)
PS管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接
(2).标准错误重定向
-标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。
隐藏某些错误或者警告
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c\~ hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c\~ hello.c &>somefilehell
(4).使用tee命令同时重定向到多个文件
-除了将需要将输出重定向到文件之外也需要将信息打印在终端$ echo 'hello shiyanlou' | tee hello
(5).永久重定向
-使用exec命令实现“永久”重定向# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile
(6).创建输出文件描述符
-默认在 Shell 中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0,1,2号文件描述符
使用exec命令可以创建新的文件描述符:
$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile
$ exit
(7).关闭文件描述符
-如上面我们打开的3号文件描述符,可以使用如下操作将它关闭:$ exec 3>&-
$ cd /dev/fd;ls -Al;cd -
(8).完全屏蔽命令的输出
-在 Linux 中有一个被成为“黑洞”的设备文件,所以导入它的数据都将被“吞噬”。/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。
我们可以利用设个/dev/null屏蔽命令的输出:
$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1
(9).使用 xargs 分割参数列表
-xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。 这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。$ cut -d: -f1 < /etc/passwd | sort | xargs echo
(10).作业
$ sudo apt-get install caca-utils
$ cacaview <pic_file>
$ cacademo
$ cacafire
11.数据流重定向
(1)简单的重定向
Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为
stdin(标准输入,对应于你在终端的输入)
stdout(标准输出,对应于终端的输出)
-
stderr(标准错误输出,对应于终端的输出)
PS管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接
(2)标准错误重定向
-标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。
隐藏某些错误或者警告
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c\~ hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c\~ hello.c &>somefilehell
(3)使用tee命令同时重定向到多个文件
-除了将需要将输出重定向到文件之外也需要将信息打印在终端$ echo 'hello shiyanlou' | tee hello
(4)永久重定向
-使用exec命令实现“永久”重定向(效果见附图)# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile
(5)创建输出文件描述符
-默认在 Shell 中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0,1,2号文件描述符
使用exec命令可以创建新的文件描述符:
$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile
$ exit
(6)关闭文件描述符
-如上面我们打开的3号文件描述符,可以使用如下操作将它关闭:$ exec 3>&-
$ cd /dev/fd;ls -Al;cd -
(7)完全屏蔽命令的输出
-在 Linux 中有一个被成为“黑洞”的设备文件,所以导入它的数据都将被“吞噬”。/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。
我们可以利用设个/dev/null屏蔽命令的输出:
$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1
(8)使用 xargs 分割参数列表
-xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。 这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。$ cut -d: -f1 < /etc/passwd | sort | xargs echo
(9)作业
$ sudo apt-get install caca-utils
$ cacaview <pic_file>
$ cacademo
$ cacafire
12.数据流重定向
(1)简单的重定向
Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为
stdin(标准输入,对应于你在终端的输入)
stdout(标准输出,对应于终端的输出)
-
stderr(标准错误输出,对应于终端的输出)
PS管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接
(2)标准错误重定向
-标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。
隐藏某些错误或者警告
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c\~ hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c\~ hello.c &>somefilehell
(3)使用tee命令同时重定向到多个文件
-除了将需要将输出重定向到文件之外也需要将信息打印在终端$ echo 'hello shiyanlou' | tee hello
(4)永久重定向
-使用exec命令实现“永久”重定向(效果见附图)# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile
(5)创建输出文件描述符
-默认在 Shell 中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0,1,2号文件描述符
使用exec命令可以创建新的文件描述符:
$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile
$ exit
(6)关闭文件描述符
-如上面我们打开的3号文件描述符,可以使用如下操作将它关闭:$ exec 3>&-
$ cd /dev/fd;ls -Al;cd -
(7)完全屏蔽命令的输出
-在 Linux 中有一个被成为“黑洞”的设备文件,所以导入它的数据都将被“吞噬”。/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。
我们可以利用设个/dev/null屏蔽命令的输出:
$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1
(8)使用 xargs 分割参数列表
-xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。 这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。$ cut -d: -f1 < /etc/passwd | sort | xargs echo
(9)作业
$ sudo apt-get install caca-utils
$ cacaview <pic_file>
$ cacademo
$ cacafire
三、调试
把Linux 下软件安装放在这一部分,作为操作实践的部分。
四、心得体会
虽然是最后时间做的很仓促的实验,但还是感觉收获了很多。学会了shell的一些操作指令,了解了linux系统的文件以及一些不同于的windows的特性。更多的学习内容还要继续,加油努力吧!!!
五、附件