Linux输入输出重定向


[yy@centos7 ~ 16:58:00]$ find /etc -name passwd > passwd.list
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
查找 /etc 目录下 文件名是passwd的所有文件
```b
[yy@centos7 ~ 16:21:06]$ find /etc -name passwd
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
/etc/pam.d/passwd
find: ‘/etc/dhcp’: 权限不够
/etc/passwd
....
将找到的文件名清单覆盖写入到passwd.list文件中
[yy@centos7 ~ 16:58:00]$ find /etc -name passwd > passwd.list
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
补充说明
1>passwd.list可简写为>passwd.list 1和>之间不能有空格
将多个文件内容合并为1个
[yy@centos7 ~ 17:00:55]$ cat /etc/fstab /etc/hosts > allinone

将找到的文件名清单追加写入到passwd.list文件中
[yy@centos7 ~ 17:05:03]$ find /etc -name 'passwd' 1>>passwd.list
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
find: ‘/etc/selinux/targeted/active’: 权限不够
find: ‘/etc/selinux/final’: 权限不够
find: ‘/etc/lvm/archive’: 权限不够
find: ‘/etc/lvm/backup’: 权限不够
find: ‘/etc/lvm/cache’: 权限不够
查看
[yy@centos7 ~ 17:05:13]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd

将错误信息覆盖写入到passwd.err文件中
[yy@centos7 ~ 17:06:13]$ find /etc -name 'passwd' 2>passwd.err
/etc/pam.d/passwd
/etc/passwd
[yy@centos7 ~ 17:06:49]$ cat passwd.err
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
将错误信息扔掉
[yy@centos7 ~ 17:07:53]$ find /etc -name 'passwd' 2>/dev/null
/etc/pam.d/passwd
/etc/passwd

将错误信息追加写入到passwd.err文件中
[yy@centos7 ~ 17:08:33]$ find /etc -name 'passwd' 2>>passwd.err
/etc/pam.d/passwd
/etc/passwd
查看
[yy@centos7 ~ 17:09:44]$ cat passwd.err
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
find: ‘/etc/selinux/targeted/active’: 权限不够
find: ‘/etc/selinux/final’: 权限不够
find: ‘/etc/lvm/archive’: 权限不
...
将错误信息和正确信息覆盖写入到不同的文件
[yy@centos7 ~ 17:10:27]$ find /etc -name passwd > passwd.list 2> passswd.err
将错误信息和正确追加覆盖写入到不同的文件
[yy@centos7 ~ 17:14:42]$ find /etc -name passwd >> passwd.list 2>> passswd.err
创建一个空文件
[yy@centos7 ~ 17:15:20]$ > testfile
[yy@centos7 ~ 17:15:45]$ >> testfile
将大文件内容释放
[yy@centos7 ~ 17:15:55]$ > bigfile
二合一输出

将错误信息正确信息覆盖写入到相同文件
[yy@centos7 ~ 17:15:55]$ find /etc -name passwd &> passwd.all
将错误信息正确信息追加写入到相同文件
[yy@centos7 ~ 17:18:34]$ find /etc -name passwd &>> passwd.all
标准输出重定向到程序
管道符(|)实现,将上一个命令的输出作为标准输入传递给下一个命令。

示例1 查看哪个man page 可以resize ext4文件系统大小
搜索所有ext4手册,并报错到ext4.man文件中
过滤ext4.man文件中含有resize的行
[yy@centos7 ~ 17:18:57]$ man -k ext4 > ext4.man
[yy@centos7 ~ 17:21:44]$ grep resizer ext4.man
以上两个命令和合并为一行
[yy@centos7 ~ 17:23:15]$ man -k ext4 |grep resizer
管道符号后的命令必须能够接收标准输入,例如ls==不==接收管道传递过来的标准输入。
tee 命令
tee 命令作用,接收管道传递过来的stdin,并继续作为stdout输出。
tee命令覆盖保存到文件
[yy@centos7 ~ 17:24:45]$ find /etc -name 'passwd' 2>/dev/null | tee passwd.list
/etc/pam.d/passwd
/etc/passwd
tee命令追加保存到文件
[yy@centos7 ~ 17:29:01]$ find /etc -name 'passwd' 2>/dev/null |tee -a passwd.list
/etc/pam.d/passwd
/etc/passwd
[yy@centos7 ~ 17:29:20]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd
tee的标准输出继续通过管道传递下去
[yy@centos7 ~ 17:29:24]$ man -k passwd | tee passwd.man | grep passwd
chgpasswd (8) - 批量更新组密码
chpasswd (8) - 批量更新密码
gpasswd (1) - administer /etc/group and /e...
mkpasswd (1) - 为用户产生新口令
passwd (5) - (未知的主题)
smbpasswd (5) - Samba加密的口令文件。
smbpasswd (8) - 改变用户的SMB口令
yppasswd (1) - 修改你在NIS数据库中...
fgetpwent_r (3) - get passwd file entry reentr...
getpwent_r (3) - get passwd file entry reentr..
标准输入重定向给程序
cat命令标准输入数据
[yy@centos7 ~ 17:29:54]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[yy@centos7 ~ 17:31:30]$ cat < /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[yy@centos7 ~ 17:31:39]$ cat << EOF
> hello
> hhh
> EOF
hello
hhh
ctrl+d 输入完成,退出
crtl+回车键 删除
cat数据源:
- 来源文件 cat /etc/hosts 或者cat < /etc/hosts
- 来源多行字符串
EOF:End Of File
判定一个命令是否接收标准输入:最简单的方式就是将文件内容作为标准输入重定向给程序。
如何一次性将多行内容写入到文件中?

重定向:>
标准输入:<
rm 删除文件,不会删除数据块。
想删除数据块。file , rm file
shell variable
变量定义和查看
变量用于保存字符串值,便于后续引用,变量值存储在当前会话内存中。
变量名只能包含:
- 字母
- 数字
- 下划线
注意: 变量名不能以数字开头
变量定义
[yy@centos7 ~ 17:40:03]$ var1=key1
[yy@centos7 ~ 17:55:48]$ declare var1=key1
[yy@centos7 ~ 17:55:53]$ echo $var1
key1
[yy@centos7 ~ 17:56:10]$ first_name=facai
[yy@centos7 ~ 17:56:40]$ last_name=zhang
[yy@centos7 ~ 17:56:53]$ echo $last_name $first_name
# 使用多个空格,效果一样
[yy@centos7 ~ 17:57:25]$ echo $last_name $first_nam
zhang
# 使用引号保留多个空格
[yy@centos7 ~ 17:58:05]$ echo "$first_name $last_name"
facai zhang
# 使用{}限定变量范围
[yy@centos7 ~ 17:58:34]$ echo ${last_name}_$first_name
zhang_facai
# 取消变量定义
unset first_name
# 定义变量时候,转换变量大小写
-l 小写 -u 大写
变量范围
-
局部变量,只在当前shell中生效。----“临时租客
想象你走进一家咖啡馆,点了一杯拿铁。服务员递给你一个一次性纸杯—— 这就是局部变量的写照。
它只在你 “喝咖啡” 这个 “动作”(函数执行)期间存在:你捧着它时,它装着热咖啡;一旦你喝完离开(函数执行结束),服务员就会把纸杯收走扔进垃圾桶(内存释放),再也找不到了。
比如函数里定义的int temp = 0,就像这个纸杯,只在函数运行时 “临时上岗”,出了函数的门,就彻底消失,其他函数也无权使用它。 -
全局变量,在当前shell以及shell子程序都生效----“常住居民”
而全局变量,更像咖啡馆里的固定咖啡机。
从咖啡馆开门(程序启动)到打烊(程序结束),它始终在吧台角落待命,所有服务员(任意函数)都能使用它:冲美式、做卡布,谁需要谁就来操作。
比如在程序开头定义的int total = 0,就像这台咖啡机,整个程序运行期间都 “常住” 内存,任何函数都能读写它的值,直到程序结束才会被 “搬离”(内存释放)。
核心区别:“活动范围” 与 “生命周期”
- 局部变量是 “临时工”,只在自己的 “小圈子”(函数内部)活跃,离开圈子就消亡;
- 全局变量是 “常住户”,在整个程序的 “大社区” 里随时待命,直到程序结束才退场
[yy@centos7 ~ 21:22:57]$ usrname=tom # 定义一个普通变量,类似“当前 Shell 的局部变量”
[yy@centos7 ~ 21:23:06]$ echo $usrname # 能输出 tom,因为在当前 Shell 生效
tom
[yy@centos7 ~ 21:23:24]$ bash # 启动一个“子 Shell”(相当于开一个新的命令窗口)
[yy@centos7 ~ 21:23:29]$ echo $count
[yy@centos7 ~ 21:24:02]$ export usrname=tom # 输出空!因为子 Shell 不继承父 Shell 的普通变量,就像“局部变量出了函数就失效”
或者
[yy@centos7 ~ 21:24:29]$ username=tom; export username # 或者分两步:username=tom; export username
[yy@centos7 ~ 21:28:52]$ echo $username
tom
[yy@centos7 ~ 21:29:03]$ bash# 再次启动子 Shell
[yy@centos7 ~ 21:29:06]$ echo $username # 输出 tom!因为 export 让变量变成“环境变量”,子 Shell 会继承
tom
环境变量
根据变量是否是用户定义:
- shell 环境内置变量:设置shell的运行环境。
- 用户自定义变量:字面意思,用户自己定义的变量,也就是普通变量。
部分shell环境变量如下:

EDITOR
[root@centos7 ~ 18:02:28]# visudo
visudo: /etc/sudoers.tmp 未更改
[root@centos7 ~ 18:03:13]# export EDITOR=/bin/vim[root@centos7 ~ 18:03:20]# visudo
visudo: /etc/sudoers.tmp 未更改
# 以上命令使用vim 编辑文件/etc/sudoers,显示语法高亮
LANG
[yy@centos7 ~]$ date
Tue Jul 22 15:00:21 CST 2025
[yy@centos7 ~]$ LANG=zh_CN.utf-8 date
2025年 07月 22日 星期二 15:00:53 CST
[yy@centos7 ~]$ export LANG=zh_CN.utf-8
[yy@centos7 ~]$ date
2025年 07月 22日 星期二 15:01:10 CST
path
[root@centos7 ~ 21:35:25]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos7 ~ 21:35:29]# mv /usr/bin/ls .
[root@centos7 ~ 21:35:35]# ls
bash: ls: 未找到命令...
相似命令是: 'lz'
#恢复
[root@centos7 ~ 21:35:42]# mv ls /usr/bin/
ps1
[yy@centos7 ~ 21:40:34]$ echo $PS1
[\u@\h \W \t]\$
提示符带时间
PS1='[\u@\h \W \t]\$ '
彩色提示符
## PS1='[\u@\[\e[32m\]\h\[\e[0m\] \W \t]\$ '
# 开始:\e[32m
# 结束:\e[m
#
# 代码:
# 30: 黑色
# 31: 红色
# 32: 绿色
# 33: 黄色
# 34: 蓝色
# 35: 紫色
# 36: 青色
# 37: 白色

变量持久化保存
-
login shell 启动的时候,会加载一下配置文件中配置
- /etc/profie,限定所有用户
- ~/.bash_profile,只限定特定用户
- ~/.bashrc,只限定特定用户
- /etc/bashrc,限定所有用户
-
nologin shell启动的时候,会加载一下配置文件中配置
- ~/.bashrc,只限定特定用户
- /etc/bashrc,限定所有用户
常见 LANG代码:
- 英语:en_US.utf8
- 简体中文:zh_CN.utf8
- 繁体中文:zh_TW.utf8
命令替换
格式如下:
- $(COMMAND)
- `COMMAND’
[yy@centos7 ~ 21:41:02]$ touch file-$(date +%Y%m%d)保留字符字面含义
许多字符在bash中有特殊的意义,忽略这些含义,使用引号和转义字符。
- \,取消后面单个字符的特殊含义。
- 双引号(“”),压缩shell扩展含义,不压缩命令替换、变量替换和转义字符。
- 单引号(‘’),可以压缩单引号内部的所有字符含义。
\ 示例
[yy@centos7 ~ 21:50:57]$ echo \$PATH
$PATH
“” 示例
[yy@centos7 ~ 21:57:07]$ username=yy
[yy@centos7 ~ 21:57:36]$ echo ******* Welcome $username to Linux Classroom On $(date +%F) *******
公共 模板 视频 图片 文档 下载 音乐 桌面 Welcome yy to Linux Classroom On 2025-07-22 公共 模板 视频 图片 文档 下载 音乐 桌面
[yy@centos7 ~ 21:57:41]$ echo "******* Welcome $username to Linux Classroom On $(date +%F) *******"
******* Welcome yy to Linux Classroom On 2025-07-22 *******
[yy@centos7 ~ 21:57:53]$
\和"" 示例
[yy@centos7 ~ 21:58:01]$ echo "******* Welcome \$username to Linux Classroom On $(date +%F) *******"
******* Welcome $username to Linux Classroom On 2025-07-22 *******
‘’ 示例
[yy@centos7 ~ 21:58:39]$ echo '******* Welcome $username to Linux Classroom On $(date +%F) *******'
******* Welcome $username to Linux Classroom On $(date +%F) *******
[yy@centos7 ~ 21:59:52]$ echo \\
\
[yy@centos7 ~ 22:00:33]$ echo \\\
>
\
[yy@centos7 ~ 22:00:41]$ echo 'let\'s go'
> '
let\s go
[yy@centos7 ~ 22:01:27]$ echo "hello 1
> hello2
> hello3"> hello.txt
[yy@centos7 ~ 22:02:13]$ cat hello.txt
hello 1
hello2
hello3
025-07-22 *******
'' 示例
```b
[yy@centos7 ~ 21:58:39]$ echo '******* Welcome $username to Linux Classroom On $(date +%F) *******'
******* Welcome $username to Linux Classroom On $(date +%F) *******
[yy@centos7 ~ 21:59:52]$ echo \\
\
[yy@centos7 ~ 22:00:33]$ echo \\\
>
\
[yy@centos7 ~ 22:00:41]$ echo 'let\'s go'
> '
let\s go
[yy@centos7 ~ 22:01:27]$ echo "hello 1
> hello2
> hello3"> hello.txt
[yy@centos7 ~ 22:02:13]$ cat hello.txt
hello 1
hello2
hello3
1783

被折叠的 条评论
为什么被折叠?



