我在文件中存储命令,我想捕获它们的输出,但这里有什么问题?
我想捕获每个命令的输出并存储在相关文件中。
以下示例,我有100个命令,我想运行并捕获optput,但我只是在下面的代码中插入我的演示testig。
我的foo.txt
/bin/ls
/bin/cat /etc/redhat-release
我的循环
[spatel@linux ~]$ IFS=$'\n'
[spatel@linux ~]$ for qw in `cat foo.txt`; do echo $qw; done
backup bar final.sh foo.txt input.txt
-bash: /bin/cat /etc/redhat-release: No such file or directory
为什么/bin/ls
运行但/bin/cat /etc/redhat-release
未运行
更新
[spatel@linux ~]$ /bin/cat /etc/redhat-release
CentOS release 6.6 (Final)
答案 0 :(得分:3)
如图所示,您的ls
实际上并未执行cat
:
$ for qw in `cat foo.txt`; do echo $qw; done
/bin/ls
/bin/cat /etc/redhat-release
要获取您显示的输出,我怀疑您实际运行了此命令;
$ for qw in `cat foo.txt`; do $qw; done
foo.txt
bash: /bin/cat /etc/redhat-release: No such file or directory
在这种情况下,执行ls
但不执行/bin/cat /etc/redhat-release
,因为没有名称为完整字符串/bin/cat /etc/redhat-release
的命令。 (shell不会在这里进行分词。)
要在一个更简单的例子中看到这一点:
$ ls *.txt
foo.txt
$ a="ls *.txt"; $a
bash: ls *.txt: command not found
要执行foo.txt中的所有命令,请运行:
$ bash foo.txt
foo.txt
CentOS release 6.6 (Final)
要运行所有命令并将其输出捕获到文件output.log
,请运行:
bash foo.txt >output.log
运行所有命令并在屏幕上显示其输出,同时还将输出捕获到文件:
$ bash foo.txt | tee output.log
foo.txt
CentOS release 6.6 (Final)
首先,在foo.txt
上运行awk以创建foo.sh
:
$ awk '{sub(/$/, (" >output" ++count))} 1' foo.txt >foo.sh
这就是foo.sh
的样子:
$ cat foo.sh
/bin/ls >output1
/bin/cat /etc/redhat-release >output2
如您所见,文件中的每个命令现在都将其stdout发送到编号文件。如果你想捕获stderr,那只是一个很小的改变。
现在,运行foo.sh
:
$ bash foo.sh
$ cat output1
foo.sh
foo.txt
output1
答案 1 :(得分:1)
很明显,因为文件/etc/redhat-release
不存在。
顺便说一句,如果你想从文件中执行命令使用一个shellcript!
source foo.sh # will execute the commands in the current shell
bash foo.sh # will launch a new shell to execute the commands
文件扩展名.sh
不是必需的。但它应该按惯例使用。
答案 2 :(得分:1)
您正在寻找的是eval命令:
while read qw; do eval $qw; done < foo.txt
虽然使用eval是非常不满意的(因为它往往会打开很多安全漏洞)。
另一种选择是从原始文件生成一个新的脚本文件,使用sed将重定向标记附加到每行的末尾。
答案 3 :(得分:0)
您在foo.txt中拥有所需的命令 怎么样:
chmod +x foo.txt
./foo.txt > my_output
如果此方法正常,请考虑将foo.txt重命名为foo.sh。