• 10.Shell标准输入、输出和错误


    文件描述符(fd):文件描述符是一个非负整数,在打开现存文件或新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来访问文件。

    内核为每个进程维护该进程打开的文件记录表。文件描述符只适于Unix、Linux操作系统。

    8.1 标准输入、输出和错误

    文件描述符

    描述

    映射关系

    0

    标准输入,键盘

    /dev/stdin ->  /proc/self/fd/0

    1

    标准输出,屏幕

    /dev/stdout ->  /proc/self/fd/1

    2

    标准错误,屏幕

    /dev/stderr ->  /proc/self/fd/2

    8.2 重定向符号

    符号

    描述

    符号左边输出作为右边输入(标准输出)

    >> 

    符号左边输出追加右边输入

    符号右边输出作为左边输入(标准输入)

    << 

    符号右边输出追加左边输入

    &

    重定向绑定符号

    输入和输出可以被重定向符号解释到shell。

    shell命令是从左到右依次执行命令。

    下面n字母是文件描述符。

    8.3 重定向输出

    1)覆盖输出

    一般格式:[n]>word

    如果n没有指定,默认是1

    示例:

    打印结果写到文件:echo "test" > a.txt

    当没有安装bc计算器时,错误输出结果写到文件:echo "1 + 1" |bc2 > error.log

    2)追加重定向输出

    一般格式:[n]>>word

    如果n没有指定,默认是1

    示例:

    打印结果追加到文件:echo "test" >> a.txt

    当没有安装bc计算器时,错误输出结果追加文件:echo "1 + 1" |bc2 > error.log

    8.4 重定向输入

    一般格式:[n]<word

    如果n没有指定,默认是0

    示例:

    a.txt内容作为grep输入:grep "test" --color < a.txt   

    8.5 重定向标准输出和标准错误

    1)覆盖重定向标准输出和标准错误

    两种格式重定向标准输出和标准错误:

    &>word和>&word 等价于 >word 2>&1  

    &将标准输出和标准输入绑定到一起,重定向word文件。

    示例:

    当不确定执行对错时都覆盖到文件:echo "1 + 1" |bc &> error.log

    当不确定执行对错时都覆盖到文件:echo "1 + 1" |bc > error.log 2>&1

    2)追加标准输出和标准错误

    追加格式:&>>word  等价于>>word2>&1

    当不确定执行对错时都追加文件:echo "1 + 1" |bc &>> error.log

    将标准输出和标准标准输入追加重定向到word:

    <<[-]word

      here-document

    delimiter

    从当前shell读取输入源,直到遇到一行只包含delimiter终止,内容作为标准输入。

    将eof标准输入作为cat标准输出再写到a.txt:

    # cat << eof
    123
    abc
    eof
    123
    abc
    # cat > a.txt << eof
    > 123
    > abc
    > eof
     

    8.6 重定向到空设备 

    /dev/null是一个空设备,向它写入的数组都会丢弃,但返回状态是成功的。与其对应的还有一个/dev/zero设备,提供无限的0数据流。

    在写Shell脚本时我们经常会用到/dev/null设备,将stdout、stderr输出给它,也就是我们不想要这些输出的数据。

    通过重定向到/dev/null忽略输出,比如我们没有安装bc计算器,正常会抛出没有发现命令:

    # echo "1 + 1" |bc >/dev/null 2>&1

    这就让标准和错误输出到了空设备。

    忽略标准输出:

    # echo "test" >/dev/null

    忽略错误输出:

     
    # echo "1 + 1" |bc 2>/dev/null

    8.7 read命令

    read命令从标准输入读取,并把输入的内容复制给变量。

    命令格式: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars][-p prompt] [-t timeout] [-u fd] [name ...]

    -e

    在一个交互shell中使用readline获取行

    -r

    不允许反斜杠转义任何字符

    -s

    隐藏输入

    -a array

    保存为数组,元素以空格分隔

    -d delimiter

    持续读取直到遇到delimiter第一个字符退出

    -i text

    将test文本作为

    -n nchars

    读取nchars个字符返回,而不是等到换行符

    -N nchars

    读取nchars个字符返回,除非遇到文件结束符或超时,其他分隔符都被忽略

    -p prompt

    提示信息

    -t timeout

    等待超时时间,秒

    -u fd

    指定文件描述符号码作为输入,默认是0

    name

    变量名

    示例:

    获取用户输入保存到变量:
    # read -p "Please input your name:" VAR
    Please input your name: lizhenliang
    # echo $VAR
    lizhenliang
    用户输入保存为数组:
    # read -p "Please input your name:" -a ARRAY
    Please input your name: a b c
    # echo ${ARRAY[*]}
    a b c
    遇到e字符返回:
    # read -d e VAR
    123
    456
    e
    # echo $VAR
    123 456
    从文件作为read标准输入:
    # cat a.txt
    adfasfd
    # read VAR < a.txt
    # echo $VAR
    adfasfd
    while循环读取每一行作为read的标准输入:
    # cat a.txt |while read LINE; do echo$LINE; done
    123
    abc
    分别变量赋值:
    # read a b c
    1 2 3
    # echo $a
    1
    # echo $b
    2
    # echo $c
    3
    # echo 1 2 3 | while read a b c;do echo"$a $b $c"; done
    1 2 3
  • 相关阅读:
    osg 导入模型发黑
    osg 拖拽器
    osgearth viewpoint 视点
    win10下无进程占用端口但是又提示端口占用的解决办法
    c++如何将指针 转为 引用 传递给方放参数
    【北亚数据恢复】服务器raid阵列瘫痪导致ZFS文件系统元文件损坏的数据恢复
    【北亚数据恢复】IBM DS系列存储服务器硬盘故障、映射出错的数据恢复
    【北亚数据恢复】存储服务器热备盘同步数据过程中硬盘掉线导致卷无法挂载的数据恢复案例
    【北亚数据恢复】IBM服务器raid5硬盘离线,热备盘未激活导致raid崩溃的数据恢复案例
    【北亚数据恢复】昆腾系列存储服务器StorNext文件系统数据恢复案例
  • 原文地址:https://www.cnblogs.com/hackerlin/p/12503907.html
Copyright © 2020-2023  润新知