【发布时间】:2016-01-01 04:14:00
【问题描述】:
“... | tee file”的作用是将标准输入(标准输入)转移到两个地方:标准输出(标准输出)和名为“文件”的路径/文件。据我判断,它实际上是这样做的:
#!/bin/bash
var=(cat) # same as var=(cat /dev/stdin)
echo -e "$var"
for file in "$@"
do
echo -e "$var" > "${file}"
done
exit 0
所以我使用上面的代码来创建 tee1 看看我是否可以模仿 tee 的作用。但我的真正意图是编写一个附加到现有文件的修改版本,而不是从头开始重做它们。我称它为 tee2:
#!/bin/bash
var=(cat) # same as var=(cat /dev/stdin)
echo -e "$var"
for file in "$@"
do
echo -e "$var" >> "${file}"
done
exit 0
这对我来说很有意义,但不是为了抨击。现在另一种方法是做这样的事情:
echo -e "$var"
for file in "$@"
do
echo -e "$var"| tee tmpfile
cat tmpfile >> "${file}"
done
rm tmpfile
exit 0
这样做对我来说也很有意义:
#!/bin/bash
cp -rfp /dev/stdin tmpfile
cat tmpfile
for file in "$@"
do
cat tmpfile >> "${file}"
done
exit 0
或者这个:
#!/bin/bash
cat /dev/stdin
for file in "$@"
do
cat /dev/stdin >> "${file}"
done
exit 0
一些在线搜索建议使用 printf 代替 echo -e 以提高跨平台的一致性。其他人建议使用 cat 代替 read,但由于 stdin 是一种设备,它应该能够代替 catm 使用,如下所示:
> tmpfile
IFS=\n
while read line
do
echo $line >> tmpfile
echo $line
done < /dev/stdin
unset IFS
然后是for循环。但我无法让它发挥作用。如何使用 bash 做到这一点?
【问题讨论】:
-
您正在使用数组赋值
var=(cat)而不是命令替换var=$(cat)。这肯定是把事情往错误的方向发展。当然,“真正的”tee在生成数据时读取和写入文件,而不是等到其标准输入上的 EOF 后再写入任何输出,但这主要是技术性问题。