Ambiguous redirect error for simple echo

I have come across an oddity when performing a simple echo command. Can anyone explain what's going on? Here's the scenario, there are exactly three files in a folder and I want to replace their contents with a blank character. The files are:

ev_tracker.css ev_tracker.html ev_tracker.js

I tried a simple command to echo a space character to all files

$ echo \ > *

and I got the following error:

bash: *: ambiguous redirect

So, I tried to be more specific…

$ echo \ > ev_tracker.*
bash: ev_tracker.*: ambiguous redirect

And more specific still…

$ echo \ > ev_tracker.{css,html,js}
bash: ev_tracker.{css,html,js}: ambiguous redirect

Finally, I performed the action on each file, individually, without error.

$ echo \ > ev_tracker.css
$ echo \ > ev_tracker.html
$ echo \ > ev_tracker.js
$

Can anyone explain why I received the error? I'm using Ubuntu 14.04 and whatever default sh variant that it would have.

3

2 Answers

echo a > *

will be expanded by bash to

 echo a > ev_tracker.css ev_tracker.html ev_tracker.js

according to man bash (REDIRECTION)

The word following the redirection operator in the following descriptions, unless otherwise noted, is subjected to (...) pathname expansion (...)

If it expands to more than one word, bash reports an error.

you can use

echo a | tee * > /dev/null

see man tee, tee command is designed to do what you are looking for.

note also that

echo \ | tee * > /dev/null

will not output a backslash to files.

1

You simply can do this:

$ echo ' ' > ev_tracker*

According to the comment below, this is what I've done.

$ touch bla blaa blaaa
$ echo ' 1' > bla*
$ cat bla 1
$ cat blaa 1
$ cat blaaa 1

It is working with only a space too, but that's difficult to show.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like