以下の名前の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
$line
touch 'grep -irl -e"1234567891" .'
ls
$line
代わりにこれを使用してください
test=$(grep -irl -e "$line" ./save)
ところで、echo $("pwd")
同じように間違った言葉はでなければなりませんecho "$(pwd)"
。ただし、名前がダッシュで始まるディレクトリにある場合-work
(たとえば)、この操作が失敗する可能性があるため、単にpwd
。
grep
最後に、以前に作成したファイル名で始まるファイルを削除するには、を使用してtouch
削除を確認します。rm -i ./grep*
y