假设你有一个包含某种终端命令的文件。每一行将如何执行?你能将 more 的输出导入到 吗eval
?
%> more ./foo.txt
编辑:
在得到一些评论的帮助/指导之后,我想我还应该注意到,我已经有一段时间没有做过任何 shell 脚本了,所以当我说eval
我可能意味着echo
或者其他执行代码的方式。
如果 foo.txt 包含多行代码,但我想执行包含 的行echo 'bar bar'
,我正在寻找一种方法来执行此操作,比如说grep
。逻辑上类似于:
grep echo foo.txt | xargs echo
答案1
eval
如果您只需要评估文件的每一行,则不需要复杂的stdout
重定向。两个简单的选项:
- 获取文件 (
source filename.sh
或. filename.sh
)。 - 使文件可执行并运行它(
chmod +x filename.sh; ./filename.sh
)
如果你确实需要eval
循环遍历文件的每一行,做while
:
while IFS= read -r line; do eval "$line"; done < filename.sh
您还可以将任何命令的输出通过管道传输到while
:
grep foo filename.sh | while IFS= read -r line; do eval "$line"; done
如果你需要将某些内容传递给source
(或.
),并且需要将文件名作为参数,则可以使用流程替代:
source <( grep foo filename.sh )