Posso redirecionar a saída de um programa para cat com um pipe?

1

Eu tenho uma pasta com três arquivos e conteúdo básico:

$ tail *
==> file1 <==
file 1 contents

==> file2 <==
file 2 contents

==> file3 <==
file 3 contents

Gostaria de ver o conteúdo do arquivo mais recente usando cat . Eu tentei usá-lo assim:

$ ls -ctr | tail -1
file3

$ ls -ctr | tail -1 | cat
file3

mas, como você pode ver, ele imprime apenas o nome do último arquivo. Eu pensei que o pipe pegaria a saída de tail e processaria o arquivo com esse nome, como acontece com o comando subshell:

$ cat $(ls -ctr | tail -1)
file 3 contents

Por que o método de redirecionamento não funciona, e existe uma maneira de fazer isso com pipes em vez da subshell?

    
por user1717828 22.01.2016 / 20:32

3 respostas

2
set   ./file[123]            ### set an arg array of the glob resolution
while [ "${2+:}" ]           ### while there are at least 2 args
do    [ "$1" -nt "$2" ] &&   ### if $1 is newer than $2 then ...
      set "$@" "$1"; shift   ### reset the array to itself + $1; shift regardless
done; cat <"$1"              ### after loop cat $1 or report no glob match
    
por 23.01.2016 / 08:57
6

Você deseja usar o comando xargs :

$ ls -ctr | tail -1 | xargs cat

Isso fará com que o STDOUT do comando tail -1 e, em vez de usá-lo como STDIN para o comando cat , use-o como opções para o comando cat .

    
por 22.01.2016 / 20:39
0

Você poderia tentar algo como

less $(ls -ctr | tail - 1)

(o $(...) não é universal, você pode precisar substituir backticks). Altere less a gosto.

    
por 23.01.2016 / 01:03