O problema é que seu shell está configurando o pipeline de comando antes de executar os comandos. Não é uma questão de "entrada e saída", é que o conteúdo do arquivo já foi embora antes mesmo de ser executado. É algo como:
- O shell abre o arquivo de saída
>
para gravação, truncando-o - O shell configura para que o descritor de arquivo 1 (para stdout) seja usado para essa saída
- O shell executa
tail
. -
tail
é executado, abre/home/pi/Documents/test
e não encontra nada lá
Existem várias soluções, mas a chave é entender o problema, o que realmente está errado e por quê.
Isso produzirá o que você está procurando,
echo "$(tail -n 50 /home/pi/Documents/test)" > /home/pi/Documents/test
Explicação:
-
$()
é chamado de substituição de comando que executatail -n 50 /home/pi/Documents/test
- as aspas preservam as quebras de linha na saída.
-
> /home/pi/Documents/test
redireciona a saída deecho "$(tail -n 50 /home/pi/Documents/test)"
para o mesmo arquivo.