更灵活的 linux shell 重定向

  • 2019-04-04
  • 102
  • 0
  • 0

Intro

在shell中运行一条指令,可以重定向输入输出流。

当一个程序开始启动后,stdin, stdout, and stderr are 0, 1,and 2,其它的文件描述符(file descriptor)则排在其后。

简单的输入输出重定向:

运行 1001 。标准输入流重定向至 in.1 ,标准输出流重定向至 out.1 。标准错误流没有重定向,继续使用 stderr

如果要将标准错误流也重定向到标准错误流,需要加入 2>&1

如果是要在文件末尾追加而不是写入新文件,替换 >>>

Harder

对于下面一条指令

本质为将 /usr/bin/time 的输入输出流重定向,而./1001的输入输出流重定向到了/usr/bin/time的输入输出流(未考证)。

会导致一个问题:time本身会将结果输出到stderr,而如果./1001也输出内容到stderr,会引起内容混乱的问题。

如果是更复杂的指令,比如希望在沙盒nsjail中运行

如果nsjail中挂载目录或读写权限不一致,还会导致文件不存在、权限不足等一系列问题。

一种解决方法,subshell

可以解决此问题。但对于沙盒来说,引入了新的问题:此方法需要更多的syscall。

Reference

  1. https://unix.stackexchange.com/questions/126014/redirect-the-output-of-a-command-in-time-command
  2. https://my.oschina.net/qihh/blog/55308
  3. https://thoughtbot.com/blog/input-output-redirection-in-the-shell

CC BY-NC-SA 4.0 本作品使用基于以下许可授权:Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

评论

还没有任何评论,你来说两句吧