Bash 命令从命令行运行,而不是从脚本中运行

Bash command runs from command line but not from within a script

在 WSL (Ubuntu) 下,我使用此命令从 .eml 文件的文件夹中提取 From: 行:

for f in *.eml; do echo -oe | grep "^From" < "$f" | sed -e "s/From://g" >> emails.txt; done

效果很好。但是,如果我将相同的命令放在 bash 脚本中,它会失败并显示以下消息:

/bin/bash: for f in *.eml; do echo -oe | grep "^From" < "$f" | sed -e "s/From://g" >> emails.txt; done: No such file or directory

请告诉我为什么。谢谢

编辑:下面是脚本,它位于 home/jim/bin(在路径中)并且来自包含 .eml 文件的目录 运行。

#!/bin/bash
for f in *.eml; do echo -oe | grep "^From" < "$f" | sed -e "s/From://g" >> emails.txt; done

您的脚本应该可以正常工作。通常,在命令行上有效的在脚本中也有效(除了别名和作业控制以及用于交互使用的类似设施)。

但是,您需要避免 useless grep. 试试这个。

#!/bin/sh
for f in *.eml; do
    sed -n '/^From: */!d;s///p;q' "$f"
done >> emails.txt

完全不清楚您希望 echo 做什么。这只是读取第一行 From: 并打印它,然后停止从该输入文件读取。

这假设您所有的 *.eml 文件都是 well-formed,即包含 From: header.

不需要循环。您可以简单地将所有文件名提供给 sed

#!/bin/bash
sed -n '/^From:/s/^From: //p' *.eml >> emails.txt