4

I have a script that outputs git repository SSH URLs, like this:

git@example.com:namespace/project.git
git@example.com: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?

Robert Dundon
  • 223
  • 2
  • 6

2 Answers2

5

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.

Robert Dundon
  • 223
  • 2
  • 6
1

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

Pavel
  • 988
  • 1
  • 8
  • 29