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")

評価括弧内にテキストを引用したため、$( ... )シェルはテキストを単語に分割できません。その結果、 の値を持つ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

関連情報