Shell重定向位

2009年5月10日,由prashant · 评论
提起下: 技术

下面是如何,我们通常做shell重定向
$ ./pgm.sh args >out.txt 2>err.txt
我想对其进行修改了一下,运行如下
$ ./pgm.sh args
的要求,输出和错误,应该去一些文件名里面pgm.sh基础上ARGS计算。 一个说明问题的例子可以当日期ARGS的一部分。 所以,你想STDOUT去说/你的/目录/ pgm_out_YYYYMMDD.txt 1

N>file.txt即重定向的标准方法的问题,相关联的文件描述符N file.txt的是,它仅适用于新分叉的过程和当前进程。
所以
$ echo hi 1>out.txt ; echo hii将发送您好out.txt但将打印HII到stdout 2

这是其中exec我们的救援。 如果我们添加exec 1>somefile.txt然后输出从脚本的其余部分将去somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$。/ test.sh将重定向您好,以及为HII out.txt

同样重定向stdout以及STDERR我们将这样做
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

现在回来了内壳重定向一些文件的原始点,让我们说程序计算一些变量OUTFILE文件名 ​​,我们可以有刚刚exec 1>$OUTFILE OUTFILE

能够解决当前的问题。 但是,您可能希望通过以下的例子,在shell脚本实现“随机存取”的文件中去。 这里的例子是
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890

有了意见,这个代码是不言而喻的。
-
1 ,它也可以$ ./pgm.sh args >pgm_out`date +%Y%m%d` `但想法是基于一些程序本身的逻辑生成这个文件的名字。
2 1 1> out.txt是多余的,但它在这里澄清,我们重定向FD 1