O script Linux Bash executa um comando de terminal em uma lista de nomes de arquivos

O script Linux Bash executa um comando de terminal em uma lista de nomes de arquivos

Eu tenho um arquivo com uma lista de nomes de arquivos que estou tentando usar como entrada em uma ferramenta específica de download de arquivos (sratools), mas meu script tem um problema

#!/bin/bash
input="<path_to_directory>/SRR_Acc_List.txt"
while IFS= read -r line
do 
    "<path_to_tool>/fastq-dump -O <desired_output_directory/ $line"
    echo "Downloading $line file"
done <"$input"

O comando funciona em uma única entrada e o eco está correto, mas a parte do comando gera o erro

line 6: ./fastq-dump -O ../../DATA_fastQ/ SRR1975008: No such file or directory

Eu apreciaria dicas sobre onde errei!

Responder1

Está linha

"<path_to_tool>/fastq-dump -O <desired_output_directory/ $line"

deveria estar

"<path_to_tool>/fastq-dump" -O "<desired_output_directory/" "$line"
#       unquoted spaces    ^  ^     they separate words    ^

então há quatro palavras. Sua linha original foi citada como um todo e interpretada como uma palavra, um nome de comando. Como o seu "nome do comando" começa com ./, deve ser um arquivo ou diretório. Mas não existe nenhum arquivo ou diretório com o nome literal ./fastq-dump -O ../../DATA_fastQ/ SRR1975008, daí o erro.

Eu citei <path_to_tool>/fastq-dumpe <desired_output_directory/apenas no caso de os valores reais conterem espaços e/ou algo assim. Pela mensagem de erro, posso dizer que não, mas em geral podem.

É muito bom você citar (por exemplo, aqui done <"$input":). O problema é que você usou um par de aspas onde certas strings tiveram que ser tratadas separadamente.

informação relacionada