을 사용하여 bash에서 명령의 출력을 읽으려고합니다 while loop
.
while read -r line
do
echo "$line"
done <<< $(find . -type f)
내가 얻은 출력
ranveer@ranveer:~/tmp$ bash test.sh
./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello
ranveer@ranveer:~/tmp$
이 후 나는 시도했다
$(find . -type f) |
while read -r line
do
echo "$line"
done
하지만 오류가 발생했습니다 test.sh: line 5: ./test.py: Permission denied
.
따라서 현재 전체 줄을 한 번에 비방한다고 생각하기 때문에 한 줄씩 읽는 방법은 무엇입니까?
필요한 출력 :
./test.py
./test1.py
./out1
./test.sh
./out
./out2
./hello
답변
답변
파일 이름에 개행 문자가 포함되는 것을 막을 수있는 것은 없습니다. find 에서 찾은 각 파일에 대해 명령을 실행하는 정식 방법 은 다음과 같습니다.
find . -type f -exec cmd {} \;
그리고 bash에서 일을 원한다면 :
find . -type f -exec bash -c '
for file do
something with "$file"
done' bash {} +
또한 스크립트에서 “읽기”명령을 호출하는 표준 방법은 다음과 같습니다 (입력에서 추가 처리를 원하지 않는 경우).
IFS= read -r var
-r
read
백 슬래시 문자를 특수 문자 (분리 기호 및 줄 바꿈의 이스케이프 문자)로 처리하는 것을 중지 하고 IFS = 구분 기호 목록을 빈 문자열로 설정합니다 read
(그렇지 않으면 공백 문자가 해당 목록에있는 경우 입력의 시작과 끝).
쉘에서 루프를 사용하는 것은 일반적으로 나쁜 생각입니다 (여러 도구가 하나 이상의 도구를 수백 번 연속 실행하는 대신 여러 도구를 동시에 동시에 작업하도록하는 쉘에서 작업이 수행되는 방식이 아님).