.sh 스크립트를 실행할 때 예기치 않은 표시 "(" 근처에서 구문 오류가 발생했습니다.

.sh 스크립트를 실행할 때 예기치 않은 표시 "(" 근처에서 구문 오류가 발생했습니다.

오류는 다음과 같습니다.

merge_star.sh: line 19: syntax error near unexpected token `('
merge_star.sh: line 19: `cat <(cat ~/asn_project/alignment_sorted/tmp/header.txt | sed 's/ /\t/g') ~/asn_project/alignment_sorted/tmp/tmp.out > ~/asn_project/alignment_sorted/STAR_counts.txt'

문제의 .sh 스크립트에 있는 줄은 다음과 같습니다.

cat <(cat ~/asn_project/alignment_sorted/tmp/header.txt | sed 's/ /\t/g') ~/asn_project/alignment_sorted/tmp/tmp.out > ~/asn_project/alignment_sorted/STAR_counts.txt
#!/bin/bash
# create header file
echo gene_name $(cd ~/asn_project/alignment_sorted && ls *_ReadsPerGene.out.tab | sed s/_ReadsPerGene.out.tab// | sort -u) > ~/asn_project/alignment_sorted/tmp/header.txt

# Place each sample's STAR gene count file - ReadsPerGene.out.tab in the tmp/ directory 
# The 2nd column (-f2) of ReadsPerGene.out.tab contains the non-stranded counts
for sample in $(cd ~/asn_project/alignment_sorted && ls *_ReadsPerGene.out.tab | sed s/_ReadsPerGene.out.tab// | sort -u)
do 
    echo ${sample}
    cat ~/asn_project/alignment_sorted/${sample}_ReadsPerGene.out.tab | tail -n +5 | cut -f2 > ~/asn_project/alignment_sorted/tmp/${sample}.count
done

# get a list of gene ids (-f1)
tail -n +5 ~/asn_project/alignment_sorted/N_1_ReadsPerGene.out.tab | cut -f1 > ~/asn_project/alignment_sorted/tmp/geneids.txt

# combine all the columns of the count files
paste ~/asn_project/alignment_sorted/tmp/geneids.txt ~/asn_project/alignment_sorted/tmp/*.count > ~/asn_project/alignment_sorted/tmp/tmp.out

# add the header
cat <(cat ~/asn_project/alignment_sorted/tmp/header.txt | sed 's/ /\t/g') ~/asn_project/alignment_sorted/tmp/tmp.out > ~/asn_project/alignment_sorted/STAR_counts.txt

# remove the tmp folder
rm -rf ~/asn_project/alignment_sorted/tmp

저는 .sh 스크립트 코딩을 처음 접했는데 어떤 오류를 수정해야 하는지 모르겠습니다. 도움을 주시면 감사하겠습니다.

답변1

댓글에서당신은 말한다을 사용하여 이 스크립트를 실행하고 있습니다 sh merge_star.sh. 이는 sh스크립트를 실행하는 데 을 사용하고 있음을 의미 하지만 첫 번째 줄( #!/bin/bash)은 bash일부 시스템에서는 동일하지만 다른 시스템에서는 다릅니다. sh다음 bashsh 포함한 일부 비 POSIX 기능입니다. 5.0 이하) 프로세스 교체( <(...)). 따라서 올바른 쉘과 올바른 호출을 사용하는 것이 매우 중요합니다.

사용 bash merge_star.sh하거나심지어 더 좋은 건, 스크립트를 실행 가능하게 만든 chmod a+x merge_star.sh다음( ) 직접 실행( ./merge_star.sh)

관련 정보