我有一个输入文件input.txt,我想运行一个命令,该命令应该从input.txt中读取两个值。让我们假设应该从输入和相同的命令中读取源名称和目标名称,以便根据input.txt重复数千次。
此外,每个命令的输出都将存储在单独的日志中。这可能是单个输入文件,还是我们需要使用2个文件作为源和目标?请求您提供用于实现此目的的shell脚本,因为我在shell脚本中很差。我尝试了以下无法正常工作。
while read i j; do
command $i $j
done > output.txt
答案 0 :(得分:1)
不确定。假设这是input.txt
:
source1.txt dest1.txt
source2.txt dest2.txt
...
你想这样做:
command source1.txt dest1.txt
command source2.txt dest2.txt
...
这是一种方式:
while read i o; do
command $i $o
done < input.txt
这假设已经构造了命令command
以从其第一个参数读取并写入其第二个参数。如果command
打印到stdout(即终端屏幕),则将command $i $o
替换为command $i > $o
。这也假设input.txt
中没有空格或有趣的字符。
如果您的input.txt
有例如{...}},那么还有一种方法会明显加快数百万行或更多:
awk '{printf "command %s\n", $0}' input.txt | sh
或者,如果您必须使用command $i > $o
:
awk '{printf "command %s > %s\n", $1, $2}' input.txt | sh
此方法从input.txt读取行并为第一行打印command source1.txt dest1.txt
,为第二行打印command source2.txt dest2.txt
等等......然后它“管道”(|
)这些命令to sh,执行它们。
对于command
中的错误处理,请尝试:
while read i o; do
command $i $o || command2 $i $o >> command2.log
done < input.txt 2> error.log
或者:
done < input.txt > error.log 2>&1
(其中一个会更好,取决于command
和command2
是否将错误打印到stdout(1)或stderr(2)。)
答案 1 :(得分:0)
假设您希望在不同文件中使用不同的输出,然后在每个命令的日志文件和每个命令的一个错误文件中使用:
while read i o; do
command $i $o 2>"$i$o.err" >"$i$o.log"
done < input.txt
错误并登录同一文件:由于stderr
,stdout
被重定向到2>&1
:
while read i o; do
command $i $o 2>&1 >"$i$o.log"
done < input.txt
您也可以将所有文件放在同一个文件output.log
中:
echo "" > output.log
while read i o; do
command $i $o 2>&1 >> output.log
done < input.txt