有点shell重定向

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

这里是如何,我们通常做shell重定向
$ ./pgm.sh args >out.txt 2>err.txt
我想稍作修改并运行如下
$ ./pgm.sh args
的要求,输出和错误,应该去一些内pgm.sh计算上ARGS名。 一个典型案例,可能是当日期是ARGS部分。 所以,你想输出到去说/ /目录/ pgm_out_YYYYMMDD.txt 1,

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

这是其中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

同样重定向标准输出以及标准错误,我们会做这样的事情
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

能够解决当前的问题。 但你可能想通过下面的示例实现“随机存取”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