更灵活的 linux shell 重定向

Intro

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

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

简单的输入输出重定向:

./1001 < 1.in > out.1

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

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

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

Harder

对于下面一条指令

/usr/bin/time ./1001 < 1.in > out.1

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

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

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

nsjail --config execute.cfg --cwd /tmp/ssojc/1 -- /usr/bin/ssct-n ./src < in.1 > out.1

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

一种解决方法,subshell

nsjail --config execute.cfg --cwd /tmp/ssojc/1 -- sh -c ' /usr/bin/ssct-n ./src < in.1 > out.1'

可以解决此问题。但对于沙盒来说,引入了新的问题:此方法需要更多的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.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注