Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

reading in from stdin from a command executed with xargs

Tags:

bash

cygwin

xargs

Using xargs did something I didn't quite expect, though I guess it sort of makes sense. This is not what I did, but this is an example which should show what happened.

fn.sh

#!/usr/bin/bash
index=1
for arg in "$@"; do echo "Arg #$index = '$arg'"; let ++index; done
read -p "type something followed by enter: "  a
echo "You typed '$a'."

Now here is the command:

echo boo hoo | xargs ./fn.sh

Now what I want is that fn.sh can read from stdin to allow user interaction, but that's been usurped by xargs. I guess I could get xargs to read from a temporary file, but I was wondering if it can use an unnamed file.

like image 378
Adrian Avatar asked Nov 13 '13 18:11

Adrian


1 Answers

I've never used cygwin, but normally I'd do something like this:

xargs -a <(echo boo hoo) ./fn.sh

-a tells xargs to read from a file, and the <( ) syntax (which might or might not work with cygwin) is process substitution, which effectively creates a named object (either a named pipe or a path starting /dev/fd) which can be read, yielding the result of running the enclosed command.

That's not as convenient as pipe syntax, since you have to put the data source in the middle of the xargs command, but it's otherwise equivalent.

like image 142
rici Avatar answered Sep 20 '22 18:09

rici