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,taceecho >>. 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.
-
-
> ./foobarredireciona 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