Feeding Multiline STDIN Input to Command
I have a script that outputs git repository SSH URLs, like this:
[email protected]:namespace/project.git
[email protected]:another_namespace/some_other_project.git
I want to run the command git clone
(or other commands) for each line.
I tried piping it to xargs
, but I either get the output in one line, or a multi line input dumped to a single command.
How do you run an arbitrary command on each line via a pipe?
Turns out, you can do this just using a while
loop in bash (adapted from this answer):
<whatever your command/output is> | while read line; do echo $line; done
Where echo
is your command and using $line
as the output for each line, which you can adjust as-needed.
Yeah, it's a bit tricky, but let me show you this example:
Here's the test data
$ cat a
1
2
3
Here's what you tried (I guess)
$ cat a | xargs echo foo
foo 1 2 3
Here's how to make it work using xargs
:
$ cat a | xargs -I '{}' echo foo '{}'
foo 1
foo 2
foo 3
So instead of just piping a list of the URLs to xargs git clone
, try defining the placeholder (-I '{}'
) and tell xargs what to do with it (git clone '{}'
).