파일 열의 각 항목에 대해 명령을 실행하고 싶습니다. 현재 다음을 수행 중이지만 모호한 리디렉션 오류가 발생합니다.
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
간단한 예를 목적으로 오류가 없기 때문에 cat
as를 사용할 수 있습니다.cmd
cmd
그 자체, 그러나 입력 리디렉션이 있습니다.
제가 실행한 실제 명령은 생물정보학 도구였습니다.칼리스토, 구체적으로 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)
괄호 안의 모든 명령은 하위 쉘에서 실행됩니다.