Erro: redirecionamento ambíguo ao transferir a saída para o comando

3

Saída para redirecionar no script:

511@ubuntu:~/Unix/test$ ls -ltr |awk '{print $9}'

default.txt
dfah.txt
fruit.txt
fruit_prices.txt
dfh.txt
header.txt
testfile.txt
topoutput.txt

Script escrito no shell:

511@ubuntu:~/Unix/test$ 
while read line
do 
var='sed -e 's/\.txt/txt\.txt/' $line'
 echo $var
 done < 'ls -ltr |awk '{print $9}''

Obtendo erro:

-bash: 'ls -ltr |awk '{print $9}'': ambiguous redirect

O especialista pode me ajudar como o redirecionamento ambíguo acontece no código acima?

    
por Aashish Raj 04.09.2014 / 23:03

4 respostas

3

tente

ls -ltr |awk '{print $9}' | while read line
do 
  var='sed -e 's/\.txt/txt\.txt/' $line'
  echo $var
done 

você deu um comando como

while read line ; do
  ...
 done < a b c d

que não pode ser analisado

    
por 04.09.2014 / 23:06
1

Parece que você está tentando fazer

while read line
do
  ...
done < <(ls -ltr |awk '{print $9}'

mas por quê? Piping into while read line (resposta do Archemar) é mais claro e mais portátil.

    
por 04.09.2014 / 23:22
0

Como "cat file | while read line ..." executa o corpo de "while" em um subshell e as variáveis do shell não serão visíveis fora do subshell, mas "while read line; do ...; done < ; < (comando) "executa-o no mesmo shell.

Aqui está o meu arquivo de teste:

$ cat fruits.txt
apple
cherry
pear
plum

Veja a diferença dos dois scripts e seus resultados:

$ cat a.sh
#!/bin/bash

FOUND=0

while read fruit ; do
    case $fruit in
    cherry)
        echo yay, cherry found
        FOUND=1
        ;;
    esac
done < <(cat fruits.txt)
echo cherry found: $FOUND

$ ./a.sh
yay, cherry found
cherry found: 1

mas

$ cat b.sh 
#!/bin/bash

FOUND=0

cat fruits.txt | while read fruit ; do
    case $fruit in
    cherry)
        echo yay, cherry found
        FOUND=1
        ;;
    esac
done
echo cherry found: $FOUND
$ ./b.sh 
yay, cherry found
cherry found: 0
    
por 11.12.2015 / 15:39
0

Você também pode fazer:

while read line; do
    var='echo "$line" |sed -e 's/\.txt/txt\.txt/''
    echo $var
done <<_EOT_
$(ls -ltr | awk '{print $9}')
_EOT_
    
por 12.12.2015 / 06:08