shell学习之< 和 > 差在哪?

严格来说,< 符号之前需要指定一个 FD 的(之间不能有空白),

但因为 0 是 < 的默认值,因此 < 与 0< 是一样的!

>   是定向输出到文件,如果文件不存在,就创建文件;如果文件存在,就将其清空;
一般我们备份清理日志文件的时候,就是这种方法:先备份日志,再用`>`,将日志文件清空
(文件大小变成0字节);

>>
这个是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,
则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。

当你搞懂了 0< 原来就是改变 stdin 的数据输入信道之后,相信要理解如下两个 redirection

就不难了:

* 1>

* 2>

前者是改变 stdout 的数据输出信道,后者是改变 stderr 的数据输出信道。

两者都是将原本要送出到 monitor 的数据转向输出到指定档案去。

由于 1 是 > 的默认值,因此,1> 与 > 是相同的,都是改 stdout 。

从 file system 的角度来说,单一档案在单一时间内,只能被单一的 FD 作写入。

假如 stdout(1) 与 stderr(2) 都同时在写入 file.both 的话,

则要看它们在写入时否碰到同时竞争的情形了,基本上是"先抢先赢"的原则。

2>&1 就是将 stderr 并进 stdout 作输出

* 1>&2 或 >&2 就是将 stdout 并进 stderr 作输出

在 Linux 档案系统里,有个设备档位于 /dev/null 。

这个 null 在 I/O Redirection 中可有用得很呢:

* 若将 FD1 跟 FD2 转到 /dev/null 去,就可将 stdout 与 stderr 弄不见掉。

* 若将 FD0 接到 /dev/null 来,那就是读进 nothing 。

比方说,当我们在执行一个程序时,画面会同时送出 stdout 跟 stderr ,

假如你不想看到 stderr (也不想存到档案去),那可以:

代码:

$ ls my.file no.such.file 2>/dev/null

my.file

若要相反:只想看到 stderr 呢?还不简单!将 stdout 弄到 null 就行

为防止重定向将原有的文件内容“冲洗”掉,可以选择>> 追加到文件末尾。

但是一旦你再次用>重定向时,还是把所有内容冲掉了。

再此,你可以用以下命令设置是否允许重定向覆盖已有文件

set -o noclobber /*设置禁止重定向覆盖*/

set +o noclobber /*设置允许重定向覆盖*/

$ cat < file > file 之后原本有内容的档案结果却被洗掉了!

要理解这一现像其实不难,这只是 priority 的问题而已:

* 在 IO Redirection 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料。

也就是说,在上例中,> file 会先将 file 清空,然后才读进 < file ,

但这时候档案已经被清空了,因此就变成读不进任何资料了...

在 if 判断式中,else 部份可以不用,但 then 是必需的。

(若 then 后不想跑任何 command ,可用" : " 这个 null command 代替)。

时间: 2024-11-06 11:51:55

shell学习之< 和 > 差在哪?的相关文章

shell学习之&amp;&amp; 与 || 差在哪?

在解答本章题目之前,先让我们了解一个概念:return value ! 我们在 shell 下跑的每一个 command 或 function ,在结束的时候都会传回父行程一个值, 称为 return value . 在 shell command line 中可用 $? 这个变量得到最"新"的一个 return value ,也就是刚结 束的那个行程传回的值. Return Value(RV) 的取值为 0-255 之间,由程序(或 script)的作者自行定议: * 若在 scri

shell学习之tr命令

tr命令不接受指定的文件参数,而只是对标准输入进行翻译, tr是translate的简写,亦即翻译,需要注意的是,它不能翻译句子,只能翻译单个字符. 首先,定义变量:     [[email protected]]#A=1,,2,,,3,,,4,,,5 下面以示例对该命令以及其常用选项进行介绍. 示例: 1.  无选项设置情况     [[email protected]]# echo $A | tr  ',' ' '         1 2   3   4   5     [[email pr

【转】十分有用的linux shell学习总结

在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们 数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux Shell的系列博客就给予了我极大的帮助,然而在实际的使用中却发现,有的时候确实忘记了某个技术点或某个Shell命令的使用方式曾经在哪一篇博客中 予以了说明,所以不得不多次点击多篇博客,直到找到想要那篇的为止,鉴于此,为了方便我们每个人的查阅,这里特别给出了前十二篇系列博客的目录以供大家参 阅和查

shell学习总结之自定义函数

shell学习总结之自定义函数 Myfun (){ echo patams1 is $1 echo -n "now i is $i " ! [ "$i" ] && exit ; echo jj return '1' } myf=$(Myfun); echo myf Myfun 12 unset Myfun Myfun echo 'the end !'$myf 别人的 #! bin/bash # ----------------------------

第八章 shell学习之循环和结构化命令

for循环 1. 列表for循环 for variable in {list}  #有些像C++/CLR中的for each do ... done 如: 1. [[email protected] tmp]# cat b.sh #! /bin/bash for i in 1 2 3 4 5      #1 2 3 4 5等价于{1..5} do echo $i done [[email protected] tmp]# ./b.sh 1 2 3 4 5 2. [[email protected

Shell学习笔记——第三章

第三章 /etc/passwd 文件包含一个所有系统用户账户组成的列表,以及一些关于每个用户的基本信息. 例rich:x:501:Rich Blum:/home/rich:/bin/bash 每个条目都有7个数据字段,例使用冒号分隔.系统使用这些字段中的数据向用户分配具体的特性.这些字段分别有 用户名:用户密码(如果密码存储在其他文件中,则为占位符):用户的系统用户ID编号:用户的系统组的ID编号:用户的全名:用户默认的主目录:用户的默认Shell目录: cd 命令 略过 列表命令(ls) 参数

Shell学习之:输入输出重定向

详细理解: linux命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器.在linux shell执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件.由于文件描述符不容易记忆,shell同时也给出了相应的文件名: 文件描述符说明列表 文件 文件描述符 输入文件-标准输入 0(缺省为键盘;0为文件或其他命令的输出) 输出文件-标准输出 1(缺省为屏幕;1为文件) 错误

第三章 shell学习之正则表达式

正则表达式 \<the\>:精确匹配the,不包括包含the的单词 [^b-d]:不包含b~d a\{2\}:a出现2次 a\{2,3\}:a出现2~3次 a\{2,\}:a至少出现2次 [:upper:]:大写字母(用的时候外面加一层[]表示匹配字符集合) [:lower:]:小写字母 [:digit:]:数字 [:alnum:]:大小写字母和数字 [:space:]:表示空格或tab键 [:alpha:]:大小写字母 通配 注意通配和正则表达式不同,虽然有共同的符号 ls -l *.sh

第四章 shell学习之sed命令和awk编程

sed命令 sed只是对缓冲区中原始文件的副本进行编辑,不改变源文件,所以要保存则要重定向到另一个文件 sed三种方式: 1.sed [选项] 'sed命令' 输入文件 2.sed [选项] -f sed脚本文件 输入文件 3../sed脚本文件 输入文件 其中3的sed脚本文件要以#! bin/sed -f等开头 选项: -n 不打印所有行到标准输出,默认先打印匹配的再打印所有 -e 关联多个sed命令 -f 调用sed脚本文件 定位文本: x x为指定行号 x,y 从x到y行 /patter