内容一:Shell脚本-重定向学习
1、创建文件读写描述符 "<>"
作用:这个文件可以读写
文件内容:
吃午饭
青藏高原
脚本代码:
#!/bin/bash
#创建文件读写描述符
exec 3<> fileContent.sh
#读取文件中的一行数据
read line <&3
#打印数据
echo "读取数据: $line"
#写入文件
echo "北京欢迎你" >&3
执行脚本
cat fileContent.sh
吃午饭
青藏高原
./A.sh
2、关闭文件描述符
关闭:读写都是不允许的
语法结构: exec 3>&-
案例一
脚本代码
#!/bin/bash
#自定义输出描述符
exec 3> fileContent.sh
#写入一句话到文件中
echo "天气真好" >&3
#关闭文件描述符
exec 3>&-
#再次写入文件
echo "大晴天" >&3
执行脚本
./A.sh
./A.sh: line 9: 3: Bad file descriptor
细节:如果说关闭文件描述符,那么再次写入就会报错
案例二
#!/bin/bash
#自定义输出描述符
exec 3> fileContent.sh
#写入一句话到文件中
echo "天气真好,晴空万里" >&3
#关闭文件描述符
exec 3>&-
#打印文件内容
cat fileContent.sh
#重新打开
exec 3>fileContent.sh
#再次写入文件
echo "大晴天" >&3
执行脚本:
./A.sh
3、列举打开的文件描述
语法结构:lsof命令(隐藏比较深,找不到,为了安全起见)
非系统管理员用户可以采用这个命令插件系统信息
命令路径:/usr/sbin/lsof
执行命令:查看结果/usr/sbin/lsof -a -p $$ -d 0,1,2
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 935 Wisdom 0u CHR 16,3 0t6197646 657 /dev/ttys003
bash 935 Wisdom 1u CHR 16,3 0t6197646 657 /dev/ttys003
bash 935 Wisdom 2u CHR 16,3 0t6197646 657 /dev/ttys003
分析命令
/usr/sbin/lsof -表示lsof命令
“-a” 表示将两个选项结果进行(AND操作)拼接(格式化输出)
"-p" 进程ID
"$$" 表示环境变量
"-d" 表示文件描述符(例如:0,1,2)
分析结果
COMMAND-表示正在运行的命令名称
PID-进程ID
USER-进程所属登录名(登录用户)
例如:管理员、成员
FD-文件描述符号以及访问类型(r表示读,w表示写,u表示读写)
TYPE -表示文件类型(CHR:表示字符型,BLK表示块型,DIR表示目录,REG表示文件)
DEVICE -表示设备号
SIZE/OFF - 如果存在,那么表示文件大小
NODE - 表示本地字节号
NAME - 表示文件名称(文件路径)
案例一:错误代码
脚本代码
#!/bin/bash
exec 3> fileContent.sh
exec 6> fileB.sh
/usr/sbin/lsof -a -p $$ -d 0,1,2
执行脚本./A.sh
执行结果
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1190 Wisdom 0u CHR 16,3 0t6198679 657 /dev/ttys003
bash 1190 Wisdom 1u CHR 16,3 0t6198679 657 /dev/ttys003
bash 1190 Wisdom 2u CHR 16,3 0t6198679 657 /dev/ttys003
总结:没有打印当前执行命令信息,因为没有指定文件描述符
案例二:正确代码
执行代码:
#!/bin/bash
exec 3> fileContent.sh
exec 6> fileB.sh
/usr/sbin/lsof -a -p $$ -d 0,1,2,3,6
执行脚本: ./A.sh
执行结果:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1210 Wisdom 0u CHR 16,3 0t6199105 657 /dev/ttys003
bash 1210 Wisdom 1u CHR 16,3 0t6199105 657 /dev/ttys003
bash 1210 Wisdom 2u CHR 16,3 0t6199105 657 /dev/ttys003
bash 1210 Wisdom 3w REG 1,4 0 35016626 /Users/Wisdom/Desktop/进阶代码/流媒体/第六天/fileContent.sh
bash 1210 Wisdom 6w REG 1,4 0 35018608 /Users/Wisdom/Desktop/进阶代码/流媒体/第六天/fileB.sh
4 、阻止命令输出- /dev/null
案例一:阻止输出
脚本代码ls -al>/dev/null
案例二:清空文件
脚本代码
#查看内容
cat B.sh
清空内容
cat /dev/null > B.sh
没有任何输出,文件为空
5、创建临时文件
5.1 创建本地临时文件 - mktemp
案例一:保证当前目录文件唯一
#动态生成文件-动态生成后缀
mktemp CC.XXXXXX
#指定文件名称-指定文件名后缀
mktemp DD.abc
案例二:在脚本使用这个命令
#!/bin/bash
#创建临时文件
tempfile=$(mktemp testfile.XXXXXX)
#重定向临时文件
exec 3>$tempfile
#打印文件名称
echo "文件名称:$tempfile"
#输入文件内容
echo "太阳" >&3
echo "月亮" >&3
#关闭文件
exec 3>&-
#打印文件内容
cat $tempfile
5.2 在/temp目录下创建临时文件
案例一:“-t”选项使用
执行代码: mktemp -t testfile.XXXXXX
执行结果: /var/folders/1h/n6rytb0n3j5f0lq45_8y71h40000gn/T/testfile.XXXXXX.LlhZiH0R
注意一:/var/folders/1h/n6rytb0n3j5f0lq45_8y71h40000gn/T系统提供临时目录
注意二:不同系统临时目录是不一样的
案例二:在Shell脚本中应用临时目录
#!/bin/bash
#创建临时文件(系统临时目录下)
tempfile=$(mktemp -t testfile.XXXXXX)
#写入内容
echo "火星人" >$tempfile
#追加内容
echo "地球人" >> $tempfile
#打印路径
echo "文件名称:$tempfile"
#将文件内容输出到控制台
cat $tempfile
# 删除文件
#rm -f $tempfile
5.3、创建临时目录
"-d" 创建目录
脚本代码
#!/bin/bash
#当前目录下创建临时目录
tempfile=$(mktemp -d testfile.XXXXXX)
#进入临时目录
cd $tempfile
#在临时目录下创建临时文件
tempfile1=$(mktemp testfile.XXXXXX)
tempfile2=$(mktemp testfile.XXXXXX)
#自定义文件描述符-重定向输出
exec 7> $tempfile1
exec 8> $tempfile2
#打印临时路径
echo "临时路径:$tempfile"
#向临时文件写入内容
echo "哈哈" >&7
echo "呵呵" >&8
6、记录消息
作用:将输出同时发送显示器和日志文件,这个时候需要重定向两次,才可以实现
现在采用tee命令一步实现
案例一:重定向-输出-覆盖
date | tee fileContent.sh
2018年 5月16日 星期三 14时54分27秒 CST
案例二:重定向-输出-追加- "-a"
date|tee -a fileContent.sh
案例三:应用到脚本中
脚本代码
#!/bin/bash
#定义文件名称
tempfile="test"
echo "我要输出到控制台和文件"|tee $tempfile
echo "我要追加内容" | tee -a $tempfile