更新后的地址: 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
其他
- 为读写打开: [n]<>word.
- 重定向处理顺序:左到右。
有的时候要注意重定向的顺序,否则可能会不正确。
- exec 可以使用指定的描述符打开一个文件(可以配合复制、移动文件描述符使用)
exec 0<test.txt 以只读方式打开文件test.txt,使用文件描述符0
exec 1>test.txt 以只写方式打开文件test.txt,使用文件描述符1,这样后面的命令的输出全部到了test.txt里
exec 1<&- 关闭文件描述符1,这样后面命令的输出全没了。
- 几个特殊的文件名
- /dev/fd/n,n是一个有效正整数,引用文件描述符n。
- /dev/stdin
- /dev/stdout
- /dev/stderr
- /dev/tcp/host/port 打开并进行socket传输
- /dev/udp/host/port 打开并进行socket传输
分享到:
相关推荐
5. **文件I/O**:在实际项目中,可能需要读取和写入文件进行数据的加密和解密。MFC提供了CFile类用于文件操作,你需要熟悉如何使用这个类来处理文件。 6. **安全性和密钥管理**:在实际应用中,密钥的安全存储和...
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。 2.@ 命令 表示不显示@后面的命令,在入侵过程中(例如使用...
- Java I/O框架主要包括`InputStream`和`OutputStream`类及其子类,以及`Reader`和`Writer`类及其子类。这些类提供了读取和写入各种数据源的基本API。 - 另外,还有`File`类用于处理文件和目录。 2. **如何在java...
【基础】I/O总结 31 【基础】Java中如何实现序列化,有什么意义? 34 【WEB】session与cookie的区别与联系;session的生命周期 34 session与cookie的区别与联系 34 session的生命周期 35 【WEB】servlet 生命周期 35...
220、文件和目录(I/O)操作 54 230、J2EE的优越性 54 231、Java语言的11个关键特性. 54 232、说出Servlet的生命周期,并说出Servlet和CGI的区别。 55 233、说出在JSP页面里是怎么分页的? 55 234、存储过程和函数的...