zoukankan      html  css  js  c++  java
  • linux中文件描述符

    #exec命令用于启动一个新的shell,并在新的shell中执行指定命令。在实际应用中,exec命令被用来 处理文件描述符,此时(也只在此时)exec不会启动新shell替代当前的shell。

    1
    root@ubuntu:/home/dyx/linux 10:40:36 19# cat ping.txt 2 PING baidu.com (220.181.111.85) 56(84) bytes of data. 3 64 bytes from 220.181.111.85: icmp_req=1 ttl=52 time=32.1 ms 4 64 bytes from 220.181.111.85: icmp_req=2 ttl=52 time=31.3 ms 5 64 bytes from 220.181.111.85: icmp_req=3 ttl=52 time=31.8 ms 6 7 --- baidu.com ping statistics --- 8 3 packets transmitted, 3 received, 0% packet loss, time 10154ms 9 rtt min/avg/max/mdev = 31.321/31.770/32.115/0.391 ms 10 root@ubuntu:/home/dyx/linux 10:40:51 20# exec 3<ping.txt ;read -u 3 name1;read -u 3 name2;echo -e "$name1 $name2";exec 3<&- 11 PING baidu.com (220.181.111.85) 56(84) bytes of data. 12 64 bytes from 220.181.111.85: icmp_req=1 ttl=52 time=32.1 ms

    #3<表示一个输入文件描述符3;
    1 root@ubuntu:/home/dyx/linux 10:50:19 23# exec 4>name_list;read name1;read name2;echo -e "The first string:$name1 
     The second string:$name2" >&4; exec 4>&-;cat name_list
    2 dyx
    3 zhouxiaoyu
    4 The first string:dyx 
    5  The second string:zhouxiaoyu

    exec和文件描述符的一个应用;

     

     

    基础知识

    文件描述符(File Descriptor),是进程对其所打开文件的索引,形式上是个非负整数。类 Unix 系统中,常用的特殊文件描述符如下:

    文件描述符 名称 常用缩写 默认值
    0 标准输入 stdin 键盘
    1 标准输出 stdout 屏幕
    2 标准错误输出 stderr 屏幕

    我们在简单地用 <  > 时,相当于使用 0<  1> (下面会详细介绍)。

    管道 (“|”, pipe line),把上一个命令的 stdout 接到下一个命令的 stdin;

    tee 命令的作用是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;

    简单重定向

    • cmd > file
    把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bash的noclobber选项可以防止覆盖原有文件。
    • cmd >> file
    把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件后面。
    • cmd < file
    使cmd命令从file读入
    • cmd << text
    从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用 <<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考后面的例子。
    • cmd <<< word
    把word(而不是文件word)和后面的换行作为输入提供给cmd。
    • cmd <> file
    以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的。
    • cmd >| file
    功能同>,但即便在设置了noclobber时也会覆盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能。

    使用文件描述符的重定向

    使用文件描述符的重定向都使用了&符号。

    cmd >&n 把输出送到文件描述符n
    cmd m>&n 把输出 到文件符m的信息重定向到文件描述符n
    cmd >&- 关闭标准输出
    cmd <&n 输入来自文件描述符n
    cmd m<&n m来自文件描述各个n
    cmd <&- 关闭标准输入
    cmd <&n- 移动输入文件描述符n而非复制它。(需要解释)
    cmd >&n- 移动输出文件描述符 n而非复制它。(需要解释)
    Note.gif
    注意: 
    >&实际上复制了文件描述符,这使得ls > dirlist 2>&1ls 2>&1 > dirlist的效果不一样。man bash的Redirection节中提及了这段内容。

    重定向的组合应用

    cmd 2>file 把文件描述符2重定向到file,即把错误输出存到file中。
    cmd > file 2>&1 把标准错误重定向到标准输出,再重定向到file,即stderr和stdout都被输出到file中
    cmd &> file 功能与上一个相同,更为简便的写法。
    cmd >& file 功能仍与上一个相同。
    cmd > f1 2>f2 把stdout重定向到f1,而把stderr重定向到f2
    tee files 把stdout原样输出的同时,复制一份到files中。
    tee files 把stderr和stdout都输出到files中,同时输出到屏幕。

    重定向实例

    Template:Bash重定向实例

    类似重定向的功能

    下面的一些用法并不属于重定向的范畴,但和重定向较为类似。

    进程替换

    bash在某些系统中的特性,可以将输入输出转到另一个程序中去,可以同时输出个多个程序,使用方法是>(list)<(list),如[1]

    wget -O - http://example.com/dvd.iso 
           | tee >(sha1sum > dvd.sha1) 
                 >(md5sum > dvd.md5) 
           > dvd.iso

    巧妙地同时完全了SHA-1MD5校验工作。

    参考:

    http://www.linux-wiki.cn/index.php/Bash%E7%9A%84%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91
  • 相关阅读:
    [20191108]内核参数tcp_keepalive与sqlnet.ora expire_time的一些总结.txt
    [20191106]善用column格式化输出.txt
    [20191101]通过zsh计算sql语句的sql_id.txt
    [20191101]完善vim的bccalc插件8.txt
    [20191031]完善vim的bccalc插件7.txt
    [20191013]oracle number类型存储转化脚本.txt
    [20191012]组成rowid.txt
    文件下载中文问题
    关闭 macOS Google Chrome 黑暗模式风格
    删除最后一次提交
  • 原文地址:https://www.cnblogs.com/yi-meng/p/3204840.html
Copyright © 2011-2022 走看看