stdin을 while 루프로 모호하게 리디렉션함 [닫기]

stdin을 while 루프로 모호하게 리디렉션함 [닫기]

파일 열의 각 항목에 대해 명령을 실행하고 싶습니다. 현재 다음을 수행 중이지만 모호한 리디렉션 오류가 발생합니다.

while read -r entry;
do
  cmd "$entry" ;
done < $(cut -f2 file.tsv)

나도 시도했다

done <(cut -f2 file.tsv)

예기치 않은 토큰 구문 오류가 발생합니다.

이를 수행하는 올바른 구문은 무엇입니까?


입력 예

탭으로 구분된 값은 관심 열의 파일 경로와 함께 파일입니다.

1    file1.txt    ...
2    file2.txt    ...
3    file3.txt    ...

예상되는 결과

스크립트는 다음 명령을 실행해야 합니다.

cmd file1.txt
cmd file2.txt
cmd file3.txt

간단한 예를 목적으로 오류가 없기 때문에 catas를 사용할 수 있습니다.cmdcmd 그 자체, 그러나 입력 리디렉션이 있습니다.

제가 실행한 실제 명령은 생물정보학 도구였습니다.칼리스토, 구체적으로 kallisto quant.

답변1

이것이 올바른 접근 방식인 것 같습니다.

while read -r entry;
do
  cmd "$entry" ;
done < <(cut -f2 file.tsv)

~에 따르면이 bash 리디렉션 치트 시트, 이 구문은 의 출력을 cut -f2 file.tsv익명 fifo에 전달한 다음 이를 stdin에 전달합니다.

답변2

코드는 다음과 같이 수정할 수 있습니다.

cut -f2  file.tsv | while read -a entry;
do
  cmd "$entry" ;

done

쉘 스크립트를 실행할 때마다 subshell이라는 새 프로세스가 생성되고 스크립트는 subshell을 사용하여 실행됩니다. 그러나 병렬 처리를 위해 Subshell을 사용할 수 있습니다. 현재 쉘 위에 또 다른 쉘을 시작하는 경우 이를 서브쉘이라고 부를 수 있습니다. 하위 쉘 값을 보려면 다음 명령을 입력하십시오.

echo $BASH_SUBSHELL

또는

echo "Current shell: $BASH_SUBSHELL"; ( echo "Running du in subshell: $BASH_SUBSHELL" ;cd /tmp; du 2>/tmp/error 1>/tmp/output)

괄호 안의 모든 명령은 하위 쉘에서 실행됩니다.

관련 정보