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
- https://unix.stackexchange.com/questions/126014/redirect-the-output-of-a-command-in-time-command
- https://my.oschina.net/qihh/blog/55308
- https://thoughtbot.com/blog/input-output-redirection-in-the-shell
本作品使用基于以下许可授权:Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.