Emular tee com cat + redirecionamentos

2

Estou aprendendo redirecionamentos bash e me pergunto se existe uma maneira de emular o comando tee com cat usando redirecionamentos. Isso é possível? Ou pode haver outras maneiras de fazer isso.

Antes de perguntar sobre tee eu apenas busquei a possibilidade de dividir um streem em dois idênticos usando a expressão bash. Mas parece ser impossível.

    
por Oleg Bolden 09.06.2017 / 23:25

3 respostas

2

Uma função bash para substituir tee , que substitui o arquivo de saída:

t(){ rm -f "$1"; while read line; do echo "$line"; echo "$line" >> "$1"; done </dev/stdin;}

E uma função bash para substituir tee -a , para anexar ao arquivo de saída:

ta(){ while read line; do echo "$line"; echo "$line" >> "$1"; done </dev/stdin;}

Eles podem ser usados assim:

t /tmp/output <somefile
ta /tmp/output <somefile

Ou junto com outros utilitários, como cat e grep , assim:

cat somefile | t /tmp/output | grep blah
cat somefile | ta /tmp/output | grep blah
    
por 10.06.2017 / 15:17
1

Você não pode fazer isso com muitos redirecionamentos, mas pode fazer algo assim:

$ cat file1
europe|EU
australia|AU
china|CN

$ cat file1 | { IFS=$'\n' read -r -d '' -a a; printf '%s\n' "${a[@]}"; printf '%s\n' "${a[@]}" >teetest; }
europe|EU
australia|AU
china|CN

$ cat teetest
europe|EU
australia|AU
china|CN

Alternativa:

$ { IFS=$'\n' read -r -d '' -a a; printf '%s\n' "${a[@]}"; printf '%s\n' "${a[@]}" >teetest; } <file1

Ou você pode criar uma função:

$ function teetest { v="$(</dev/stdin)";printf '%s\n' "$v";printf '%s\n' "$v">teetest; }

$ cat file1 |teetest
europe|EU
australia|AU
china|CN

$ cat teetest
europe|EU
australia|AU
china|CN
    
por 10.06.2017 / 00:59
1

Com zsh , sim, não com bash .

com zsh :

cat file.in > file1.out > file2.out

ou até mesmo:

< file.in > file1.out > file2.out

(executando $NULLCMD : cat por padrão)

Observe que cat tem apenas um stdout no qual grava o conteúdo de file.in . Acima, o stdout de cat é um pipe. E zsh lê essa saída da outra extremidade para gravá-la em file1.out e file2.out .

Em outras palavras, não há mágica lá, zsh está apenas implementando tee internamente.

    
por 10.06.2017 / 15:12