来自文件

时间:2015-05-08 17:48:01

标签: linux bash for-loop scripting

我在文件中存储命令,我想捕获它们的输出,但这里有什么问题?

我想捕获每个命令的输出并存储在相关文件中。

以下示例,我有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)

4 个答案:

答案 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。