shell脚本重定向

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

#循环遍历读取

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

你可能感兴趣的:(shell脚本重定向)