
아래 이름의 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