Question

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.

Was it helpful?

Solution

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.

OTHER TIPS

I found this question trying to solve the same issue, and then took a closer look at the xargs manpage.

The -o option should accomplish exactly and predictably what is desired:

-o: Reopen stdin as /dev/tty in the child process before executing the command. This is useful if you want xargs to run an interactive application.

Just wanted to update the answer to this older question as it was the first result in my search.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top