이 스크립트가 있습니다.
while read $item;
do
# Some bash logic here
done <<< "$({ cat /path/to/some/file; echo; })"
이제 나는 또한 일부 디렉토리의 이름을 찾아 find
루프와 함께 cat
전달하고 싶습니다 while
.
즉, 나는 다음을 원한다:
cat
하나의 문서find
일부 디렉토리- 연결 결과
while
여기에 문서로 루프 에 입력하세요.
나는이 시점에서 막혔다.
while
논리를 반복하는 것은 좋은 접근 방식이 아니라고 생각했습니다 . 또한 while
루프 내에서 논리를 재사용하기 위해 함수를 사용하는 것도 고려했습니다 .
그러나 여기에 있는 문서의 내용을 연결하는 것이 올바른 접근 방식인 것 같습니다.
답변1
사실 <<< "$({ cat /path/to/some/file; echo; })"
은 하나야여기에 있는 문자열인용이 포함되어 있습니다명령 대체여기 문서 대신. ~처럼카밀 마코로프스키가지다이미 지적함, 명령 대체에서 두 명령의 결과를 연결하는 방법을 이미 알고 있으며 cat /path/to/some/file
및 다음을 사용하여 동일한 작업을 수행 echo
할 수 있습니다 .cat
find
... <<< "$(cat /path/to/some/file; find . -name '*foo*')"
{ ... }
명령이 이미 그룹화되어 있으므로 내부 명령은 생략했습니다 $( ... )
.
그러나 IMHO를 사용하는 것이 더 자연스럽습니다.프로세스 교체출력을 연결합니다. 이것이 어떻게 작동하는지 보려면 간단한 입력 리디렉션으로 시작하십시오.
while IFS= read -r item
do
# Some bash logic here
done < /path/to/some/file
그런 다음 stdin을 통해 파일 내용을 루프로 리디렉션합니다.
while IFS= read -r item
do
# Some bash logic here
done < <(cat /path/to/some/file)
출력을 cat /path/to/some/file
동일한 방식으로 리디렉션할 수 있는 의사 파일로 변환합니다. 이제 프로세스 목록에 또 다른 표준 출력 생성 명령을 추가하기만 하면 됩니다.
while IFS= read -r item
do
# Some bash logic here
done < <(cat /path/to/some/file; find . -name '*foo*')
예시 보기
모든 경우에 구문은 read item
가 아닙니다 read $item
.