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
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?
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
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.
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
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_