Printing to terminal directly:
$ ls
a.out avg.c avg.h
Piping to cat
$ ls | cat
a.out
avg.c
avg.h
Why does ls
give a different output based on destination?
ls
can actually determine if it's outputting to a terminal or a file (with the isatty
library call). If it detects a console, it will try to make it more compact for easier viewing.
ls
automatically behaves like ls -1
when piped.
This is usually what you want when you are piping ls
to awk
or something like that, since it will treat the output of ls
on a line-by-line basis.
To override this default behavior, you can use ls -C | cat
.
So that each line is one entry only, allowing the command the output is piped to to work as would likely be expected. For example (given your ls
output), the following would probably not be what you want:
$ ls | sort -r
a.out avg.c avg.h
But because sort
didn't know there was more than one item per line, it couldn't do anything. Compare this to what actually occurs:
$ ls | sort -r
avg.h
avg.c
a.out
You can achieve the (unexpected) first behavior by passing -C
to ls
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With