来自 bash 的 Grep 返回没有这样的文件或目录,但如果从 CLI 手动执行相同的命令则可以工作

来自 bash 的 Grep 返回没有这样的文件或目录,但如果从 CLI 手动执行相同的命令则可以工作

如果我执行下面名为 的 bash 脚本test.sh,我会收到此错误:

./test.sh: line 8: grep -irl -e"1234567891" ./save: No such file or directory

如果我从 CLI“手动”执行从错误中获取的上面的行,它会按预期工作并找到包含所请求模式的单个文件。

#!/bin/bash

list="text_list.txt"
ddt_folder1="Save/"

while IFS= read -r line
do
  test=$("grep -irl -e\"$line\" ./save")
  echo "$test"
done < "$list"

到目前为止测试过:

在循环之前在顶部回显“pwd”,并且路径是保存文件夹所在的正确路径

echo $("pwd")

我还使用目标目录的完整路径进行了测试:

test=$("grep -irl -e\"$line\" ./full/path/save")

还使用完整的 grep 路径进行了测试:

test=$("/usr/bin/grep -irl -e\"$line\" ./full/path/save")

测试 grep 类型的完整路径:

type /usr/bin/grep
/usr/bin/grep is /usr/bin/grep

无论如何,在所有测试中,如果我从 cli“手动”使用错误消息中显示的命令,它就可以工作。

我缺少什么!?

非常感谢

答案1

错误就在这里

test=$("grep -irl -e\"$line\" ./save")

您已经引用了求值括号内的文本$( ... ),因此 shell 无法将其拆分为单词。结果是它尝试执行在的值所在的save目录中调用的命令。 (是的,这可以是真实的文件/目录名称;尝试然后)显然,无论插入到字符串中的 值如何,它都不会存在。grep -irl -e"1234567891" .1234567891$linetouch 'grep -irl -e"1234567891" .'ls$line

用这个代替

test=$(grep -irl -e "$line" ./save)

顺便说一句,echo $("pwd")同样不正确,应该是echo "$(pwd)"。但是,如果您所在的目录名称以破折号(例如-work)开头,则这可能会失败,因此可以更轻松、更正确地将其简单地写为pwd

grep最后,要删除您之前使用 创建的文件名开头的文件touch,请使用rm -i ./grep*并输入y以确认删除。

相关内容