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

관련 정보