`
姜太公
  • 浏览: 74899 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

也说说I/O重定向

阅读更多

更新后的地址: IO重定向

 

用过Unix的恐怕没有不知道I/O重定向的,ls>a.txt就是一个I/O重定向。所谓I/O重定向,简单的理解就是透明的改变命令预定的输入源或输出目的地,像ls>a.txt就是把输出目的地改成了a.txt而不是预定的stdout.

 

要想理解好I/O重定向,就不能不对Unix的文件描述符(File Descriptor)有所了解。文件描述符的概念和在C语言里的操作,这里不再赘述了,资料很多。此处只说说Shell里的重定向。

 

输出重定向

 

格式[n]>word

Shell先对word进行各种扩展(花括号、波浪号、变量扩展等,详见Shell命令中的扩展和替换 ),将最后扩展的结果作为一个文件。Shell打开这个文件并在内部将新得到的文件描述符复制到n。n如果省略则默认为1

>和>>的区别在于,使用前者,Shell会创建新文件,如果文件已经存在,原来的内容会被清空。后者要文件必须存在,在文件后面添加内容。

 

输入重定向

  格式[n]<word

Shell先对word进行各种扩展(花括号、波浪号、变量扩展等,详见Shell命令中的扩展和替换 ),将最后扩展的结果作为一个文件。Shell打开这个文件并在内部将新得到的文件描述符复制到n。n如果省略则默认为0,也就是标准输入。

 

同时重定向标准错误和标准输出

格式:&>word或>&word,推荐第一种。shell支持对word的扩展,且word扩展后作为一个文件名。相当于:
>word 2>&1

Here Documen t: 把下面一段代码重定向到命令的标准输入。
格式 <<[-] word
        here-document
    delimiter

delimiter是一个结束指示器,相当于我们在控制台输入的ctrl+D。
Shell不对word进行任何扩展。

[jjz@localhost test]$ abc=hello
[jjz@localhost test]$ cat <<$abc
> this is here document
> hello            这里并未停止,shell不对$abc进行扩展,结束符是$abc而不是hello
> $abc
this is here document
hello
 

如果word是引号括起来的,delimiter为word去除所有的引号后字符串,不对here-document进行扩展。

[jjz@localhost test]$ cat << "DONE"
> $abc
> DONE
$abc    DONE两边有引号,因此没有对abc进行扩展
 

如果word没有引号,对here-document进行扩展。

[jjz@localhost test]$ cat << DONE
> $abc
> DONE
hello    对abc进行了扩展
 

如果写了-,则输出是所有的引导tab都去除.

还有一种形<<<word,对word扩展并作为命令的标准输入。

 

复制文件描述符
输入:格式 [n]<&word。

这个功能和直接在c里面调用dup2()差不多,很好很强大。

word扩展之后应该得到一个数字。shell得到word所指定的输入描述符的一个copy,并设定为n。如果word所制定的数字不是一个有效地输入描述符,会出错。如果word得到的结果是 -,则输入被关闭。n默认为0.复制输出描述符也是这样的。

输出:格式 [n]>&word。

和上面差不多,只不过这个是复制输出描述符。

word扩展之后应该得到一个数字。shell得到word所指定的输入描述符的一个copy,并设定为n。如果word所制定的数字不是一个有效地输出描述符,会出错。如果word得到的结果是 -,则输入被关闭。n默认为0.复制输出描述符也是这样的。


移动输出描述符
输入:形式 [n]<&digit-

移动文件描述符digit到n。支持对digit的扩展。

基本上就是先copy到n再关闭digit。

输出:形式 [n]>&digit-

和上面相似,不过是针对输出的

 

注: 虽然上面说复制和移动文件描述符是要注意输入和输出的区别,不过根据我的尝试,复制和移动文件描述符时,shell不会判断文件描述符是输入还是输出(因为dup2不判断……),所以照样可以用1(标准输出)<&x,把输出的文件描述符x复制到1,不是只能使用1>&x

 

其他

  1. 为读写打开: [n]<>word.
  2. 重定向处理顺序:左到右。
    有的时候要注意重定向的顺序,否则可能会不正确。
  3. exec 可以使用指定的描述符打开一个文件(可以配合复制、移动文件描述符使用)
    exec 0<test.txt   以只读方式打开文件test.txt,使用文件描述符0
    exec 1>test.txt   以只写方式打开文件test.txt,使用文件描述符1,这样后面的命令的输出全部到了test.txt里
    exec 1<&-           关闭文件描述符1,这样后面命令的输出全没了。

  4. 几个特殊的文件名
    • /dev/fd/n,n是一个有效正整数,引用文件描述符n。
    • /dev/stdin
    • /dev/stdout
    • /dev/stderr
    • /dev/tcp/host/port 打开并进行socket传输
    • /dev/udp/host/port 打开并进行socket传输

 

 

分享到:
评论

相关推荐

    I/O重定向简明教程(命令使用)

    I/O重定向简明教程(命令使用) I/O重定向简明教程(命令使用)

    网络编程中的I / O重定向

    应用程序打开或关闭文件时,需要由操作系统来决定如何访问包含了指定文件内容的一个设备。找到设备后, I / O请求会被转发给一个本地设备驱动程序。通过网络来访问一个设备也同样。...我们将其称为“I / O重定向”(I/O

    基于C++实现的Linux的 Shell 程序+项目开发文档,实现基本的命令执行功能,支持 I/O 重定向和管道操作

    本项目旨在开发一个用于 Linux 的 Shell 程序,利用 C++ 标准库和 Linux 系统调用来实现。该 Shell 程序提供了基本的命令执行功能,支持 I/O 重定向和管道操作,并实现了一些内置命令

    Linux环境下I_O重定向与异步通信的实现.pdf

    在Linux操作系统中,I/O重定向与异步通信是两个重要...通过I/O重定向实现资源的有效利用,通过异步非阻塞I/O提升系统吞吐量和响应时间,这两者结合使得在资源有限的环境中,如视频监控系统,也能实现高性能的通信功能。

    擦除编码存储集群的一种高效的基于I / O重定向的重构方案

    提出了一个基于I/O重定向的重构方案,名为“RAM-RS”。该方案的目的是最小化用户和重构请求之间的I/O干扰。RAM-RS通过将针对故障节点的用户读写请求重定向到一个通过预分配的主存形成的、以RS编码方式构建的RAM区域...

    Linux下重定向详解

    在深入了解Linux下的I/O重定向之前,首先需要掌握一些基础的概念。 - **I/O重定向**:通常与文件描述符(File Descriptor, FD)有关,shell中通常包含10个文件描述符,编号为0至9。 - **常用文件描述符**: - 0 ...

    Linux下的输入/输出重定向.pdf

    在Linux操作系统中,输入/输出重定向是一种强大的功能,它允许我们改变命令的默认行为,即将标准输入、标准输出和标准错误输出从默认设备(通常是键盘、显示器和显示器)重定向到文件或其他输入源。这一特性对于自动...

    CSAPP_shell_lab

    csapp_shelllab原版,已经有大部分的框架,完成几个信号处理函数和求值函数

    Linux实验八:LinuxC-编程-IO-重定向和管道.doc

    在Linux系统中,I/O重定向和管道是两种重要的进程间通信(IPC)方式,它们允许我们改变程序的标准输入、输出和错误流,或者在不同的进程中传递数据。本实验主要涵盖了这两个主题,通过编写和运行C语言程序来实践。 ...

    例程:将command的输入输出重定向到自己的进程

    这个过程涉及到操作系统级别的I/O重定向和管道原理。 在操作系统中,命令行(如cmd或bash)可以接收用户输入的命令,并将结果输出到屏幕。然而,我们有时希望捕获这些输入和输出,以便进行进一步处理,或者将它们与...

    craft-reroute, 在 控制面板 中,管理 301/302 重定向.zip

    301 重定向是一种永久重定向,当网站的某个页面被永久移动到新的 URL 时,使用 301 重定向可以将旧的 URL 指向新的 URL,从而保留原有的搜索引擎排名和流量。另一方面,302 重定向是临时重定向,通常用于页面临时...

    Shell 输入/输出重定向

    同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。 重定向命令列表如下: 命令 说明 command &gt; file 将输出重定向到 file。 command &lt; file&gt;&gt; file 将输出以追加的方式重定向到 file...

    shell(C语言开发)

    4. I/O 重定向:myshell 支持 I/O 重定向,stdin 和 stdout。 5. 后台程序执行:myshell 支持后台程序执行。 myshell 的源代码 myshell 的源代码主要包括以下部分: 1. 头文件引用:myshell.c 文件中引用了 stdio...

    操作系统期末复习资料

    dup和I/O重定向原理(案例分析) 文件逻辑地址、物理地址的概念 文件创建过程 一体化目录和分解式目录的概念 文件搜索过程 三种文件组织方式的概念和原理:顺序、链接、索引(不要FAT、NTFS) 增量式索引文件...

    Shell命令解释系统设计

    在本文中,我们将深入探讨如何设计一个具备处理前后台运行命令、管道、I/O重定向以及多命令执行功能的Shell。 首先,我们要理解Shell命令解释器的核心职责。它的主要工作是接收用户的命令输入,解析这些命令,并...

    An Efficient I/O-Redirection-Based Reconstruction Scheme for Erasure-Coded Storage Clusters

    ### 高效基于I/O重定向的重构方案用于擦除编码存储集群 #### 摘要及背景介绍 本文提出了一种高效的I/O重定向重构方案(RAM-RS),旨在解决在线重构过程中用户I/O与重构I/O之间的I/O干扰问题。在擦除编码存储集群中...

    IO system and File System

    I/O系统重定向是指把I/O操作从一个文件重定向到另一个文件或设备。select()函数则用于同时监视多个文件描述符的I/O状态。 7. 设备驱动的常规操作: 文档中提到了许多设备驱动程序执行的操作,包括向设备写入数据、...

    Note of Learning Perl--I/O Basics

    在这个主题中,我们将深入探讨Perl中的输入/输出(I/O)基础知识,这对于任何Perl程序员来说都是必不可少的知识。 **一、Perl中的I/O流** 在Perl中,输入/输出操作是通过文件句柄完成的,它是一个特殊的变量,用于...

    57119101_王晨阳_实验21

    【实验报告】:“57119101_王晨阳_实验21”是关于构建一个简易Linux Shell的实践项目,旨在让学生理解Shell的工作原理,并实现包括管道(pipeline)、输入/输出重定向(I/O redirection)在内的基本功能。...

Global site tag (gtag.js) - Google Analytics