Veja como seu comando é analisado:
-
(…)
é um comando composto. O conteúdo dos parênteses é executado em uma subcamada.-
ls | tac | echo >>
é um pipeline que consiste em três partes:ls
,tac
eecho >>
. A saída da parte mais à esquerda está conectada à entrada da segunda parte e a saída da segunda parte é conectada à entrada da parte mais à direita. -
ls
é um comando simples, executando um arquivo executável. -
tac
é um comando simples, executando um arquivo executável. -
echo >>
não está sintaticamente correto. O operador>>
precisa ser seguido por um nome de arquivo e o nome do arquivo está ausente.
-
-
> ./foobar
redireciona a saída do comando composto para o arquivo./foobar
.
Direcionar a entrada para echo
não faz sentido: ela não lê nenhuma entrada. Para usar echo
para anexar à saída de algum outro comando, execute echo
após o outro comando, não em paralelo.
ls | tac; echo
A saída de echo
está indo para o mesmo local que a saída de tac
, portanto não há necessidade de redirecionamento.
( ls | tac; echo ) >./foobar
Você não precisa de uma subshell aqui. Um simples agrupamento serve. (Consulte Operadores lógicos simples no Bash para obter um resumo dos parênteses do bash como operadores.)
{ ls | tac; echo; } >./foobar
O uso do operador >>
para acrescentar só seria necessário se você estivesse anexando a um arquivo já existente. Este não é o caso aqui: todos os comandos vão para o mesmo local, o arquivo foobar
é aberto apenas uma vez e permanece aberto enquanto o comando composto estiver sendo executado. O operador >>
seria necessário se você abrisse o arquivo duas vezes:
ls | tac >./foobar; echo >>./foobar