Shell脚本语言中将:输入、输出、错误分为了三种描述符(3种状态)->分别对应的值(0、1、2)
0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)
将输出重定向到 file : command > file
将输入重定向到 file: command < file
将输出以追加的方式重定向到 file: command >> file
将错误重定向到file: command 2> file
1.临时重定向输出:
脚本中,代码末尾加 ">&"
例:重定向输出错误
echo "Hello world" >&2 ---标记错误信息
终端执行
./fileA.sh 2> error.sh
会将标记错误的代码输出到 error.sh 文件中
2.永久重定向输出:
exec 1> fileB.sh
echo "Hello world"
终端直接执行 ./fileA.sh 即可, 没有fileB.sh文件的话,会默认创建
如果保存错误信息的话,还是需要在末尾加 ">&2" , 如:
exec 2> error.sh
echo "这就是个错误" >&2
3.输入重定向:
#从 fileB.sh 文件中读取内容到 fileA.sh 里面
exec 0<fileB.sh
#循环遍历读取
count=1
while read line
do
echo "当前行数:$count 读取内容:$line"
count=$[ $count + 1 ]
done
ps: 输入重定向,read 命令会自动链接文件输入内容
4. 创建输出文件描述 部分重定向输出:
exec 3>&1 这里是开始是3,重定向为1
exec 1> fileB.sh 用1,设定重定向输出到文件fileB.sh
echo "Hello world" 这块代码会输出到 fileB.sh 文件中
echo "welcome" 这块代码会输出到 fileB.sh 文件中
exec 1>&3 这里还原为3
echo "end" 这里还原为正常输出
5.创建输出文件描述:
exec 3<&0
exec 0< fileB.sh
count=1
while read line
do
echo "当前行数:$count 读取内容:$line"
count=$[ $count + 1 ]
done
exec 0<&3
read param
echo "输入的是: ${param}"
6.读写
exec 6<>fileB.sh
read line <&3 从 fileB.sh 文件里面读取第一行内容
echo "Read:$line"
echo "I have a Dream" >&3 在 fileB.sh 写入内容,ps:这里会从第二行开始写,因为上面读过一次,文件指针改变
7.关闭文件描述符
7.1 关闭写入
exec 3> fileB.sh 设定重定向输出到文件 fileB.sh
echo "hello" >&3 输出到文件 fileB.sh 中
exec 3>&- 关闭写入
echo "world" >&3 会报错,无法写入
7.2 关闭读取
exec 3< fileB.sh 设定重定向输如为文件 fileB.sh
read line <&3 读取文件 fileB.sh 第一行
echo "${line}"
readline1 <&3 再读一次,读取文件 fileB.sh 第二行
echo "${line1}"
exec3<&- 关闭读取
readline2 <&3 报错,无法读取
echo "${line2}"
ps:关闭之后也可以重新打开继续搞
8./dev/null 文件
这是一个空文件,所有写入的内容,都会被丢弃!如果尝试从该文件读取内容,那么什么也读不到! 在重定向这里,可以起到阻止输出或者清空文件的作用
阻止输出:
ls -al > /dev/null
将要输出的内容重定向到 /dev/null 文件,终端不再显示,也找不到输出内容
清空文件:
cat /dev/null > fileA.sh
因为从 /dev/null 文件读取不到任何内容! 重定向到 fileA.sh 文件,就是把 flieA.sh 文件中的内容替换! 也就是说,以空替换原本内容,起到清空的作用
当前目录下创建临时文件
file=$(mktemp tempfile.XXXXXX)
临时目录下创建临时文件
file=$(mktemp -t tempfile)
当前目录下创建临时目录
temp=$(mktemp -d tempfile.XXXXXX)
删除创建的临时文件
rm -f $file
删除创建的临时目录及其包含的子文件
rm -r -f $temp ps:注意不能目录内删除
tee 命令 : 同时输出到控制台和指定文件中
file = "fileA.sh"
echo "输出到控制台和文件" | tee $file
追加的话
echo "输出到控制台和文件" | tee -a $file