I've got a question here that I dont understand:
cat abc.dat | tee bcd.dat | tr ab ba > cde.dat
In this instance, I understand the translate part, but I’m a little confused as to what the pipe | does, I’ve been told that it takes the stdout of a program with the stdin of another. If I were to try to explain this, correct me if I’m wrong but you’re taking abc.dat’s contents, duplicating the output into bcd.dat, and then taking the content from bcd.dat and translating instances of a and b into b and a respectively, and then taking that and putting it into cde.dat?
The official answer is: abc.dat is copied to bcd.dat. and abc.dat is copied to cde.dat but with 'a’ replaced by 'b' and 'b‘ replaced by 'a'. But why is abc.dat copied into cde.dat instead of bcd.dat? does the pipe not continue?
CodePudding user response:
The "official" answer is poorly worded. Neither tee
nor tr
know anything about abc.dat
; it just happens that what it reads from tee
is what tee
read from cat
, which is what cat
read from abc.dat
.
CodePudding user response:
The tee
utility reads from stdin and writes this firstly to stdout, and secondly to all files given as argument. In your case, stdin is written to stdout, and to file bcd.dat
. The pipe behind the tee
links the stdout of tee
to the stdin of the tr
. Although the data is the same, it is not the content of file bcd.dat
that is being piped to tr
. It is the output of the initial cat
, which in turn is the content of file abc.dat
.