将输出重定向到文件或程序
- 标准输入、标准输出和标准错误
进程使用称为文件描述符的通道来获取输入并发送输出。所有进程在开始时至少要有三个文件描述符:标准输入(通道0)从键盘上读取输入;标准输出(通道1)将正常输出发送到终端;标准错误(通道2)将错误消息发送到终端
通道(文件描述符)
-- 0 stdin 标准输入 键盘 仅读取
-- 1 stdout 标准输出 终端 仅写入
-- 2 stderr 标准错误 终端 仅写入
]# ls -l /dev/std*
lrwxrwxrwx. 1 root root 15 Mar 14 17:15 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Mar 14 17:15 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Mar 14 17:15 /dev/stdout -> /proc/self/fd/1
- 将输出重定向到文件
重定向stdout可以阻止进程输出显示在终端上。stdout不会阻止stderr错误消息显示在终端上。如果文件不存在,则会创建文件;如果文件确实存在,但是所需的重定向没有附加到文件,则该文件的内容将被覆盖。如果想要丢弃消息,特殊文件/dev/null以静默的方式丢弃重定向到其自身的通道输出,并且始终是空文件。
输出重定向操作符:
-- > file 重定向stdout以覆盖文件
-- >> file 重定向stdout以附加到文件
-- 2> file 重定向stderr以覆盖文件
-- 2> /dev/null 将stderr错误消息重定向到/dev/null,从而将它丢弃
-- > file 2>&1或& > file 重定向stdin和stderr以覆盖同一个文件
-- >> file 2>&1或&>> file 重定向stdin和stderr附加到同一个文件
#将命令的输出重定向到某个文件中
[user@serverb ~]$ date >/tmp/saved-timestamp
[user@serverb ~]$ cat /tmp/saved-timestamp
Sat Mar 18 14:33:08 CST 2023
#将命令的错误消息重定向到某个文件中,标准输出默认输出在终端
[user@serverb ~]$ find /etc/ -name passwd 2> /tmp/errors
/etc/passwd
/etc/pam.d/passwd
[user@serverb ~]$ cat /tmp/errors
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
#将命令的标准输出和标准错误分别重定向到两个不同的文件中
[user@serverb ~]$ find /etc/ -name passwd > /tmp/output 2> /tmp/errors
[user@serverb ~]$ cat /tmp/output /tmp/errors
/etc/passwd
/etc/pam.d/passwd
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
#将标准输出重定向到某个文件中,标准错误直接忽略
[user@serverb ~]$ find /etc/ -name passwd > /tmp/output 2> /dev/null
[user@serverb ~]$ cat /tmp/output
/etc/passwd
/etc/pam.d/passwd
#将标准输出和标准错误一并重定向到文件中
[user@serverb ~]$ find /etc/ -name passwd &> /tmp/saved-both
[user@serverb ~]$ cat /tmp/saved-both
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
/etc/passwd
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
/etc/pam.d/passwd
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
#将标准输出和标准错误追加到现有的文件中
[user@serverb ~]$ find /etc/ -name passwd >> /tmp/saved-both 2>&1
构建管道
管道是一个或多个命令的序列,用竖线字符(|)分隔。管道将第一个命令的标准输出连接到下一个命令的标准输入
#查看最近更新的是个文件并重定向到文件中
[user@serverb etc]$ ls -tl | head -10 >/tmp/ten-last-change-file
[user@serverb etc]$ cat /tmp/ten-last-change-file
total 1100
-rw-r--r--. 1 root root 58 Mar 14 16:21 subgid
-rw-r--r--. 1 root root 58 Mar 14 16:21 subuid
----------. 1 root root 408 Mar 14 16:21 gshadow
-rw-r--r--. 1 root root 518 Mar 14 16:21 group
----------. 1 root root 766 Mar 14 16:21 shadow
-rw-r--r--. 1 root root 976 Mar 14 16:21 passwd
-rw-r--r--. 1 root root 22607 Mar 14 10:34 ld.so.cache
----------. 1 root root 737 Mar 13 21:09 shadow-
-rw-r--r--. 1 root root 503 Mar 13 20:49 group-
- tee命令
当重定向和管道重合时,shell会首先设置整个管道,然后重定向输入/输出。如果管道的中间使用了输出重定向,则输出将转至文件,而不是下一个前往管道中的下一个命令
#终端上没有任何输出
[user@serverb glob]$ ls -l >/tmp/files | less
#如果使用了tee命令,终端会有文件的内容
[user@serverb glob]$ ls -l | tee /tmp/files | less
#管道末尾使用tee命令,则可以保存命令的最终输出并且同时输出到终端
[user@serverb etc]$ ls -tl |head -n 10 | tee /tmp/last-files
total 1100
-rw-r--r--. 1 root root 58 Mar 14 16:21 subgid
-rw-r--r--. 1 root root 58 Mar 14 16:21 subuid
----------. 1 root root 408 Mar 14 16:21 gshadow
-rw-r--r--. 1 root root 518 Mar 14 16:21 group
----------. 1 root root 766 Mar 14 16:21 shadow
-rw-r--r--. 1 root root 976 Mar 14 16:21 passwd
-rw-r--r--. 1 root root 22607 Mar 14 10:34 ld.so.cache
----------. 1 root root 737 Mar 13 21:09 shadow-
-rw-r--r--. 1 root root 503 Mar 13 20:49 group-
vim编辑器
最小化安装的Linux系统没有vim编辑器,需要安装vim-minimal软件包。vim编辑器是随Linux和unix系统分发的vi编辑器改进的,功能特别强大。
如果文件不存在,则vim可以新建文件
编辑器的三种模式:
命令模式 插入模式 末行模式
命-----按i键-----插入模式(按ESC键回到命令模式)
令
模
式-----按:键-----末行模式(按ESC键回到命令模式)
命令模式下复制、粘贴:
复制1行(yy)、复制3行(3yy)
粘贴到当前行之后(p)
命令模式下删除:
删除单个字符(x)
删除到行首(d^)、删除到行尾(d$)
删除1行(dd)、删除3行(3dd)
命令模式下查找关键字:
搜索(/word) 切换结果(n、N)
补充:在命令模式下大写的C,可以删除光标之后,并且进入输入模式
- vim的可视模式
可视模式是一种突出显示和操作文本的绝佳方式;最明显的就是在生产环境中修改配置文件(可批量取消注释和批量添加注释)
-- 操作方法:
添加注释:
1.将光标放在要注释首行的行首CTRL+v进入可视模式
2.向下移动光标,选中要添加注释的行
3.按下shift+i键,并输入#
4.按下ESC键,过后就批量注释了
取消注释:
1.将光标移动到要取消注释的首行的行首CTRL+v进入可视模式
2.向下移动光标,选中要取消注释的行
3.按下shift+x,即可取消注释
更改shell环境
bash shell允许设置shell变量,你可以使用这些变量来帮助运行命令和修改shell的行为。还可以将shell变量导出为环境变量,他们会在程序启动时自动复制到从该shell运行的程序中
- 使用变量
变量定义的命名规则:可以包含大写或小写字母、数字和下划线
#定义一个变量
[user@serverb ~]$ variablename=value
#可以使用$来引用变量
[user@serverb ~]$ echo $variablename
value
#使用unset取消一个变量
[user@serverb ~]$ unset variablename
使用set命令列出当前设置的所有shell变量
#定义一个变量,就能在set命令的最后看到所定义的变量
[user@serverb ~]$ set | less
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
... ...
- 使用shell变量配置bash
-- 例子1:history命令是显示当前用户所执行的历史命令,有两个shell变量定义HISTFILE(历史命令存放的文件)和HISTFILESIZE(定义历史命令的条数)
[user@serverb ~]$ echo $HISTFILE
/home/user/.bash_history
[user@serverb ~]$ echo $HISTFILESIZE
1000
扩展:如何将history显示的内容加上日期时间
vim ~/.bashrc
#在文件最后一行添加
HISTTIMEFORMAT="%F %T "
#加载配置文件
source ~/.bashrc
#展示
[user@serverb ~]$ history | head -1
1 2023-03-18 14:32:31 date
-- 例子2:PS1变量显示的是shell提示符的格式
[user@serverb ~]$ echo $PS1
[\u@\h \W]\$
#可以修改
vim ~/.bashrc
#添加变量
PS1="[\u@\h \t \W]\$"
source ~/.bashrc
#提示符变了
[user@serverb 17:03:53 ~]$
使用环境变量配置程序
以上的HISTFILE和HISTFILESIZE、PS1不需要导出为环境变量,因为它们仅仅供shell本身使用,而不由从该shell运行的程序使用。
#例如修改语言
[user@serverb 17:18:20 ~]$echo $LANG
en_US.UTF-8
[user@serverb 17:18:39 ~]$export LANG=zh_CN.utf8
[user@serverb 17:18:53 ~]$date
2023年 03月 18日 星期六 17:18:55 CST
#env命令可查案shell的所有环境变量
[user@serverb 17:31:56 ~]$env
XDG_SESSION_ID=31
HOSTNAME=serverb
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
USER=user
... ...
- 重要的环境变量PATH
PATH变量是一个含有程序目录的冒号分隔列表
[user@serverb 17:25:15 ~]$echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
当运行ls等命令是,shell会按照顺序逐一在这些命令中查找可执行文件ls,并且运行它找到的第一个匹配的文件
#自己创建一个命令
[user@serverb 17:30:05 ~]$vim aiguo
[user@serverb 17:30:47 ~]$bash aiguo
i love you
[user@serverb 17:30:51 ~]$chmod +x aiguo
[user@serverb 17:31:11 ~]$./aiguo
i love you
[user@serverb 17:31:16 ~]$pwd
/home/user
#将脚本所在目录添加到环境变量中
[user@serverb 17:31:24 ~]$export PATH=$PATH:/home/user
[user@serverb 17:31:53 ~]$aiguo
i love you
自动设置环境变量
- 按照惯例,shell自动设置的环境变量和shell变量具有使用全部大写字母的名称。如果要设置自己的变量,可能需要使用由小写字符组成的名称来帮助避免命名冲突。
- 如果希望在shell启动时自动设置shell或环境变量,可以编辑bash启动脚本。启动bash时,会运行几个包含shell命令的文本文件,以初始化shell环境。
重要:
在Linux中,以下是四个常见的shell配置文件及其作用和区别:
1./etc/profile:系统级别的全局配置文件,对所有用户都生效。在用户登录时,该文件会被读取并执行,设置一些系统级别的环境变量、别名、PATH等。一般不建议在该文件中添加个人的配置信息,因为这会影响所有用户。
2./etc/bashrc:系统级别的bash shell配置文件,同样对所有用户都生效。在用户打开新的终端时,该文件会被读取并执行,设置一些系统级别的别名、环境变量等。一般也不建议在该文件中添加个人的配置信息。
3.~/.bash_profile:用户级别的bash shell配置文件,仅对当前用户生效。在用户登录时,该文件会被读取并执行,设置个人的环境变量、PATH、别名等。一些基于bash的系统,如macOS,默认会在用户主目录下创建该文件,以便用户自定义shell配置。
4.~/.bashrc:用户级别的bash shell配置文件,仅对当前用户生效。在用户打开新的终端时,该文件会被读取并执行,设置个人的别名、环境变量、shell函数等。该文件是用户自定义shell配置的主要文件,经常用于设置个人的命令别名、修改提示符等。
总的来说,系统级别的配置文件作用于所有用户,个人级别的配置文件仅作用于当前用户。在修改这些配置文件时,建议备份原有的文件,并确保修改不会影响系统的正常运行。