Linux输入输出重定向与Shell variable

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值