标准输入,标准输出和标准错误
进程使用称为文件描述符的编号通道来获取输入并发送输出。所有进程都至少有三个通道:通道0,stdin,标准输入,指从键盘读取输入。通道1,stdout,标准输出,将正常发送到终端。通道2,stderr,标准错误,将错误信息发送到终端。如过程序打开连接至其他文件的单独连接,则需要其他更大编号的通道。
输入输出重定向
输出重定向操作符
操作符 | 说明 |
---|---|
> file | 重定向stdout,如果文件不存在则会创建,存在则会覆盖,不影响stderr |
>> file | 重定向stdout,如果文件不存在则会创建,存在则会追加,不影响stderr |
2> file | 重定向stderr,如果文件不存在则会创建,存在则会覆盖,不影响stdout |
2> /dev/null | 重定向stderr至/dev/null,以此丢弃 |
&>file 或 >file 2>&1 | 重定向stdout和stderr至同一文件,如果文件不存在则会创建,存在则会覆盖 |
&>>file 或 >>file 2>&1 | 重定向stdout和stderr,如果文件不存在则会创建,存在则会追加 |
重定向示例
[root@#test ~]# date > /tmp/save_time
[root@#test ~]#
[root@#test ~]# tail /tmp/save_time
2023年 9月 18日 星期一 23:21:40 CST
构建管道
管道是一个或多个命令构成的序列,用 | 来分隔。管道将第一个命令的标准输出连接到下一个命令的标准输入。
I/O重定向和管道都可以操作标准输出和标准输入。I/O重定向的对象是文件,从文件获取标准输入,或向文件标准输出。管道的对象是进程,将一个进程的标准输出发送到另一个进程的标准输入。
管道示例
[root@#test ~]# ls -l
总用量 12
-rw-------. 1 root root 1257 8月 8 11:26 anaconda-ks.cfg
-rw-r--r-- 1 root root 447 9月 16 16:56 editing_final_lab_1694854574.txt
-rw-r--r-- 1 root root 1942 9月 16 18:04 editing_final_lab.txt
[root@#test ~]#
[root@#test ~]# ls | wc -l
3
I/O重定向,管道和tee
当重定向和管道组合时,管道会首先被设置(或者说被执行),然后在执行重定向。因此,如果管道中执行了输出重定向,则输出将会被重定向到文件,而不会前往管道的下一个命令。
如下,执行后会打开less,但是less里面并没有内容。而在/tmp/save_output中会有ls的输出。
[root@#test ~]# ls >/tmp/save_output |less
[root@#test ~]#
tee命令
tee命令避免了上述情况。tee命令功能是从标准输入读取,再写入标准输出和文件。(将前面命令的输出作为输入,分别发送给标准输出即终端和参数指定的文件)
[root@#test ~]# ls |tee /tmp/save_output #将ls的输出发送给了终端和
#/tmp/sava_output
anaconda-ks.cfg
editing_final_lab_1694854574.txt
editing_final_lab.tx
注意
可以使用管道来重定向标准错误,但是不能使用合并重定向运算符(&> 和 >>&)来执行此操作。以下是正确命令。
vim编辑器
vim管理模式
打开vim,他会以命令模式启动。此时
i 键:进入插入模式,在此模式下进行文本输入。按esc返回到命令模式。
v ,shift+V 或 Ctrl+V :进入可视模式,在此模式下"Shift+V"对文件进行按行选择,"Ctrl+V"对文件进行按块选择。
按:键启动命令拓展模式,对文件进行保存等操作。
在命令模式中,u键可撤销最近的编辑。X键可删除单个字符。
重排现有文本
在vim中复制和粘贴称为拖拉和放置,使用的命令字符是y和p,首先将光标定位到要选择的第一个字符。然后进入可视模式,使用箭头键扩展可视选择准备好时,按y将所选内容拖放到内存中,将光标定位到新位置上,然后按p将所选内容放置到光标处。
更改shell环境
使用shell变量
bash shell 允许设置shell变量,可以使用shell变量来帮助运行命令或修改shell的行为。此外可以将shell变量导出为环境变量,环境变量会在程序启动时自动复制到从该shell运行的程序中。
因此可以使用变量来更轻松的运行带有长参数的命令,或者将常用设置应用于从该shell运行的命令。
shell变量对于特定的shell会话是唯一的,如果打开了两个终端窗口,或者通过两个独立的登录会话,登录同一远程服务器,此时运行的是两个不同的shell,每个shell都有自己的一组变量值。
以下语法定义变量。注意,等号两边不能有空格。
[root@#test ~]# VARIABLE=VALUE
可以使用set命令查看当前设置的所有shell变量,他还会列出所有shell函数,这个列表很长,一般配合less命令使用。
[root@#test ~]# set | less
使用变量拓展检索值
使用 变量拓展 来指代已设置的变量值。(在变量名前加上符号 $)
一种实际的示例是使用变量来指代多个命令的长文件名。
变量名称左右有任意别的字符时,都应该用花括号保护变量名称。
[root@#test ~]# var1=/tmp/save_time
[root@#test ~]# ls -l $var1
-rw-r--r-- 1 root root 43 10月 2 23:21 /tmp/save_time
使用shell变量配置bash
某些shell变量在bash启动时被设置,以此来配置和调整shell的行为。比如,变量 HISTFILE 和 HISTFILESIZE,前者将会指定shell历史记录文件的存储位置,通常情况下这是 ~/.bash_history。后者将会指定历史记录的命令的个数。
使用环境变量配置程序
shell为程序运行提供一个环境,此环境包括有关文件系统上当前工作目录信息,传递给程序的命令行选项以及环境变量的值。不是环境变量的shell变量只能有shell本身使用,环境变量可以由shell和此shell运行的程序使用。
通过export导出变量为环境变量。
[root@#test ~]# export EDITOR=vim
[root@#test ~]#
应用程序和会话使用这些环境变量来确定某些行为。比如,shell启动时会自动晶HOME变量设置为用户主目录的的文件名,用以帮助程序确定保存文件的位置。LANG用以设置区域,调整语言。
环境变量PATH,PATH变量包含一个含成簇的目录的冒号分隔的列表。
[root@#test ~]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin
每当运行系统二进制命令时(比如ls),shell将会按照上面列表的顺序注意的查找名为“ls”的可执行文件,然后运行匹配到的第一个文件。通常ls会在/usr/bin/ls。
可以在PATH变量后添加其他目录。例如,当我们希望像运行常规命令那样运行我们在 /home/user/sbin 的可执行程序或者脚本,可以将 /home/user/sbin 添加到PATH的末尾。
[root@#test ~]# export PATH=${PATH}:/home/user/sbin
[root@#test ~]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin:/home/user/sbin
环境变量EDITOR,设置默认文本编辑器,如果不指定,多数程序使用vi或者vim,可以手动覆盖为nano。
注意:按照惯例,shell自动设置的环境变量和shell变量均为全大写的英文字符名,如PATH。因此,我们设置shell变量时最好使用小写。
自动设置脚本
如果希望在shell启动后自动设置shell或环境变量,可以编辑bash启动脚本。当shell启动时,会运行几个包含shell命令的文本文件,以初始化shell环境。
运行的确切脚本取决于shell的启动方式,交互式登录shell,交互式非登录shell或者shell脚本。
在默认情况下,如果要更改影响所有交互式shell提示符的用户账户,请编辑 ~/ . bashrc 文件。
此处其他细节待补充。。。。。
取消设置变量和取消导出变量
unset 命令,完全取消设置变量和导出变量。
[root@#test ~]# unset var1
[root@#test ~]# echo $var1
[root@#test ~]#
export -n 命令,指取消导出,不取消设置为shell变量。