Redirecionamento ambíguo para stdin para loop while [closed]

0

Eu gostaria de executar um comando para cada entrada em uma coluna de um arquivo. No momento, estou fazendo o seguinte, mas estou recebendo um erro de redirecionamento ambíguo.

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

Eu também tentei

done <(cut -f2 file.tsv)

que gera um erro de sintaxe de token inesperado.

Qual é a sintaxe correta para fazer isso?

Exemplo de entrada

Um arquivo de valores separados por tabulações com caminhos de arquivo na coluna de interesse.

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

Resultado Esperado

O script deve executar os comandos

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

Para o propósito de um exemplo simples, você pode usar cat como cmd , já que o erro não é com o cmd per se , mas com o redirecionamento de entrada. / p>

O comando que estou executando é a ferramenta de bioinformática kallisto , especificamente kallisto quant .

    
por merv 23.09.2018 / 03:11

2 respostas

0

Parece que este é o jeito certo de fazer isso:

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

De acordo com esta folha de dicas de redirecionamento de bash , essa sintaxe passa a saída de cut -f2 file.tsv para um fifo anônimo, depois passa para stdin.

    
por 23.09.2018 / 03:38
0

Seu código pode ser revisado da seguinte forma:

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

done

Por favor, note que sempre que você executar um shell script, ele cria um novo processo chamado subshell e seu script será executado usando uma subshell. No entanto, um Subshell pode ser usado para fazer o processamento paralelo. Se você iniciar outro shell no topo do seu shell atual, ele pode ser chamado de subshell. Digite o seguinte comando para ver o valor subshell:

echo $BASH_SUBSHELL

OR

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

Todos os comandos entre parênteses são executados em um subshell.

    
por 23.09.2018 / 04:00