Example:

ls | echo prints nothing ( a blank line, actually ). I'd expect it to print a list of files.

ls | grep 'foo', on the other hand, works as expected.

What is do in these situations is something like: ls | while read OUT; do echo $OUT; done but this is rather cumbersome.

Why does piping work with some commands, but not with others ? How can I circumvent this issue ?

link|improve this question

What do you expect ls | echo to do? why not simply run ls? – theomega Sep 16 '10 at 13:46
I used the simplest example that illustrates my point. I actually encountered this problem when I was trying to make a one-liner that would show git objects in the object store and their type. So, I piped object ID's to git cat-file, but it just didn't work. Apparently, echo has the same behaviour, so I used it as an example. – Mihai Rotaru Sep 16 '10 at 14:10
also look at the -n command for xargs, it says how many arguments to put on subcommand. ` ... | xargs -n1 git cat-file` – Rich Homolka Sep 16 '10 at 22:05
feedback

4 Answers

up vote 6 down vote accepted

There is a distinction between command line arguments and standard input. A pipe will connect standard output of one process to standard input of another. So

ls | echo

Connects standard output of ls to standard input of echo. Fine right? Well, echo ignores standard input and will dump its command line arguments - which are none in this case to - its own stdout.

There are a few solutions in this case. One is to use a command that reads stdin and dumps to stdout, such as cat.

ls | cat

Will 'work', depending on what your definition of work is.

But closer to what you want is to converting stdout to command line args. As others have said, xargs is the canonical tool in this case, reading it's command line args for a command, then stdin and constructing commands to run.

ls | xargs echo

You could also convert this some, using the substitution command $()

echo $(ls)

Would also do what you want.

Both of these tools are pretty core to shell scripting, you should learn both.

link|improve this answer
A very helpful an informative answer, thank you ! I'm currently learning bash, and I've seen both xargs and the $(*) notation before, but didn't pay much attention to them. Now I know just how important they are, and will definitely look into them. – Mihai Rotaru Sep 16 '10 at 14:41
feedback

ls | echo prints just a blank line because echo reads no input; the last command of the pipeline is actually echo that prints nothing but a blank line.

Generally:

a | b

makes sure that the output of a become the input of b. I suggest you to read the Pipelines section of man bash.


If you really want to use ls and echo together here's some (pretty useless) examples:

ls | xargs -L 1 echo
echo `ls`
for i in `ls` ; do echo $i ; done
link|improve this answer
feedback

If you want to echo the ls command try:

ls | xargs echo

This will call echo with the output of ls.

link|improve this answer
feedback

Why not simply use:

echo `ls`

Or much safer:

echo "`ls -lrt`"
link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.