在 while 循环中带有输入重定向的命令

Command with input redirection inside while loop

我正在尝试在包含要执行的命令的文本文件中循环:

    while IFS= read -r line
    do
      $line
    done < msmtp-cmds.txt

文本文件中的命令是:

  msmtp -t < message1.txt
  msmtp -t < message2.txt

命令替换后,重定向符号似乎被忽略了,因为 msmtp 正在尝试使用 message1.txt 作为收件人,但我不明白为什么

< 不是命令的参数; shell 语法在 之前 参数扩展被解析。如果您的意图是执行从文件中读取的任意代码,那就是 eval 的目的。

while IFS= read -r line; do
  eval "$line"
done < msmtp-cmds.txt

但是,到那时,您还不如只获取文件而不是逐行读取它:

. smtp-cmds.txt