echo não está funcionando

1

Isso é o que eu estou tentando alcançar passo a passo:

  1. ls
  2. , em seguida, inverta a saída
  3. adicione uma nova linha ao último deste arquivo

Por isso, fiz o seguinte script de uma linha, mas está dando erro

(ls | tac | echo >>) > ./foobar

Eu posso fazer isso dividindo em vários comandos, mas estou tentando fazer isso em um único comando.

Estou confuso porque echo >> ./foobar insere uma nova linha no final do arquivo.

Então, por que minha linha de código não está funcionando? Por que echo >> não está adicionando nova linha no final do descritor de arquivo, mas dando erro? O que estou fazendo errado aqui?

    
por GypsyCosmonaut 30.06.2017 / 22:21

3 respostas

1

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 e echo >> . 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
    
por 02.07.2017 / 23:59
3

O >> diz ao shell para anexar a saída dos comandos ao nome do arquivo diretamente após os símbolos (assim, pelo menos você teria que adicionar um nome antes do colchete de fechamento).

Para o que você gostaria de fazer, você poderia fazer:

ls | tac > ./foobar; echo >>./foobar

ou:

(ls | tac; echo ) >./foobar

Ambos estão alcançando o mesmo resultado.

    
por 30.06.2017 / 22:36
2

Para alcançar o resultado conforme especificado, é possível fazer:

echo -e "'ls | tac'\n" > ./foobar

Dessa forma, a saída de ls é canalizada por tac . O resultado está contido no comando echo e a interpretação do caractere de escape de echo adicionará uma nova linha. O stdout pode então ser redirecionado para um arquivo.

Eu não acredito que seja possível canalizar stdout em eco.

    
por 30.06.2017 / 22:31