Shounak Gujarathi
Shounak Gujarathi

Reputation: 49

Give output of one shell script as input to another using named pipes

I'm new to linux and have been coding some beginenr level shell scripts. What I want to do is write 2 scripts. The first script will read input from user and the 2nd script will display this input in a loop till it detects an "exit" from the user.

This is how I've coded the 2 shell scripts.

File1.sh:

read var1
echo $var1

File2.sh:

while [ "$var2" != "exit" ]
do
  echo $1
  read var2
done

Now, I want to use a named pipe to pass the output of File1.sh as input to var1 of File2.sh. I probably will have to modify code in File2.sh so that it will accept argument from a named pipe (as in instead of $1 the input will be from the named pipe), but I'm not at all sure how to go about it.

Giving the output of File1.sh as input to the named pipe can be given as follows:

mkfifo pipe
./File1.sh > pipe

This command keeps asking for input until i break out using ctrl + c. I don't know why that is. Also how do I make the File2.sh read from this pipe?

will this be correct?

pipe|./File2.sh

I'm very new to linux but I've searched quite a lot online and there isn't even one example of doing this in shell script.

Upvotes: 0

Views: 5618

Answers (3)

Shounak Gujarathi
Shounak Gujarathi

Reputation: 49

This is how I solved it. First mistake I made was to declare the pipe outside the programs. What I was expecting was there is a special way in which a program accepts input parameters of the type "pipe". Which as far as I've figured is wrong.

What you need to do is declare the pipe inside the program. So in the read program what you do is,

For File1.sh:

pipe1=/Documents
mkfifo pipe1
cat > pipe1

This will send the read input from the user to the pipe. Now, when the pipe is open, it will keep accepting input. You can read from the pipe only when its open. So you need to open a 2nd terminal window to run the 2nd program.

For File2.sh:

while("$input" != "exit")
do
     read -r input < pipe1
     echo "$input"
done

So whenever you input some string in the first terminal window, it will be reflected in the 2nd terminal window until "exit" is detected.

Upvotes: -1

tripleee
tripleee

Reputation: 189487

As for your original question, the syntax to read from a named pipe (or any other object in the file system) is

./File2.sh <pipe

Also, your script needs to echo "$var2" with the correct variable name, and double quotes to guard the value against wildcard expansion, variable substitution, etc. See also When to wrap quotes around a shell variable?

The code in your own answer has several new problems.

  • In File1.sh, you are apparently attempting to declare a variable pipe1, but the assignment syntax is wrong: You cannot have whitespace around the equals sign. Because you never use this variable for anything, this is by and large harmless (but will result in pipe1: command not found which is annoying, of course).

  • In File2.sh, the while loop's syntax is hopelessly screwed; you dropped the read; the echo still lacks quotes around the variable; and you repeatedly reopen the pipe.

while [ "$input" != "exit" ]
do
     read -r input
     echo "$input"
done <pipe1

Redirecting the entire loop once is going to be significantly more efficient.

Notice also the option -r to prevent read from performing any parsing of the values it reads. (The ugly default behavior is legacy from the olden days, and cannot be fixed without breaking existing scripts, unfortunately.)

Upvotes: 1

acw1668
acw1668

Reputation: 46697

First in File1.sh, echo var1 should be echo $var1.

In order to get input from pipe, try:

./File2.sh < pipe

Upvotes: 0

Related Questions