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 '{}').