Shell I/O重定向

① 默认I/O

默认情况下,在登陆时,shell自动将标准输入设置为 “键盘”,将标准输出和标准错误设置为 “屏幕”。

1,
标准输入(stdin) :代码为 0 ,使用 < 或 << ;
对应设备号 /dev/stdin -> /proc/self/fd/0 ,0 代表:/dev/stdin 。
2,
标准输出(stdout):代码为 1,使用 > 或 >> ;
对应设备号 /dev/stdout -> /proc/self/fd/1 ,1代表:/dev/stdout 。
3,
标准错误输出(stderr):代码为 2,使用 2> 或 2>> ;
对应设备号/dev/stderr -> /proc/self/fd/2 ,2代表:/dev/stderr 。

info  proc 查了一下/proc/self/ 和/proc/[number]/fd这些都是什么东西?

/proc/self
              This  directory  refers  to  the  process  accessing  the  /proc
              filesystem, and is identical to the /proc directory named by the
              process ID of the same process.
这个目录对应操作/proc文件系统的线程本身,也就是说/proc/self/和/proc/[number]/是一样的。

/proc/[number]/fd
              This is a subdirectory containing one entry for each file  which
              the process has open, named by its file descriptor, and which is
              a symbolic link to the actual file.  
              Thus, 
                0,is standard input,
                1,is standard output, 
                2,is standard error, 
              etc.              

实例查看:

root@37C:~$ ll /dev/stdin 
lrwxrwxrwx 1 root root 15 920 14:04 /dev/stdin -> /proc/self/fd/0 
root@37C:~# ll /proc/self/fd/0
lrwx------ 1 root root 64 9月  21 14:12 /proc/self/fd/0 -> /dev/pts/2
root@37C:~# ll /dev/pts/2  #最终链接到了字符设备。
crw------- 1 py tty 136, 2 9月  21 14:13 /dev/pts/2
# 使用tty查看本终端对应的设备文件。
root@37C:~# tty
/dev/pts/2

尝试下面的执行:

while [ 1 ]; do echo "1111" > /proc/self/fd/2; done
或者
while [ 1 ]; do echo "1111" > /dev/stdin; done

--查看FD的关闭现象:
ls -l /proc/self/fd/ 0<&- 2>&-
ls -l /proc/self/fd/

②使用>和>>重定向的要点

对于Shell两大家族:
(1)将命令的输出覆盖到文件中 command > filename

   例如:ls > file1
   命令执行效果:
         如果不存在file1,则创建,并写入ls的输出内容;
         如果已存在file1,则清除其内容,写入ls的输出内容.

(2)将命令的输出追加到文件尾 command >> filename

   例如:ls >> file1
   命令执行效果:
         如果不存在file1,则创建,并写入ls的输出内容;
         如果已存在file1,则将ls的输出内容追加到文件尾.

(3)如何避免疏忽覆盖了源文件。
防范措施:
(Bash, Korn shell)家族:
With the Bourne shell family (Bash, Korn shell):
–set the noclobber shell option:
$ set -o noclobber

–To unset this option, use:
$ set +o noclobber

设置之后:
1): 对于 > 的影响 。
当 names 文件还没有存在时,
sort > names,将创建一个names文件.(情况和之前没设置noclobber选项一样)

当 names 文件已经存在,
sort > names ,那么将报错:cannot overwrite existing file.

但是,我们还是可以强制将其覆盖,如下:
$ sort >| names

2): >> 追加数据的情况:
B-shell家族运行和之前没设置的一样
文件没有则创建, 有就追加。


③ 重定向的一些技巧

1.同时将标准输出和错误输出到同个位置。
1):截断模式。
$ ls run.py error.sh > output 2>&1
2):追加模式。
$ ls run.py error.sh >> output 2>&1
3):简洁模式(只限于bash)

# 截断模式
$ ls run.py error.sh &> output
# 追加模式,好像低版本的bash并不支持。
$ ls run.py error.sh &>> output

4):容易犯错写法。

# 2>&1 的顺序在前。这并没错误。
# 但是,标准错误会指向显示器。
# 实际顺序:1.标准错误指向显示器 2.标准输出指向output。
$ ls run.py error.sh 2>&1 > output

2.抛弃输出。
抛弃输出: 不希望看到某些信息,或者不希望保存某些信息的时候,将其抛弃。
可抛弃标准输出和标准错误。
/dev/null:位桶 ,发送给该文件的任何东西都会永远消失!

--抛弃:
--单独抛弃:
update > /dev/null
update 2> /dev/null

--同时抛弃:
update > /dev/null 2>& 1

练习:

如下几种重定向方式,看看会出什么结果,为什么?
$ find /home -name lost* > all_result 1>&2  # all_result文件没有内容,所有输出都在屏幕。
$ find /home -name lost* 2> all_result 1>&2 # 所有的输出都在all_result文件。
$ find /home -name lost* 2>&1 1> all_result # 错误在屏幕,标准输出在文件。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值