Question: Given:

```
$ cat lines.txt
a/b
'c/d e/f'

$ cat 1.sh
#!/bin/sh
./2.sh `cat lines.txt`

$ cat 2.sh
#!/bin/sh
echo p1=$1
echo p2=$2
echo p3=$3

$ ./1.sh
p1=a/b
p2='c/d
p3=e/f'

```

How do I change `lines.txt` or `1.sh`, so that `2.sh` receives only two arguments:

* **`a/b`**
* **`c/d e/f`**

?

Answer: 
Set the IFS (internal field separator) to a newline:

```
$ cat 1.sh 
#!/bin/sh
OLD_IFS=$IFS
IFS="
"
./2.sh `cat lines.txt`
IFS=$OLD_IFS

$ ./1.sh
p1=a/b
p2='c/d e/f'
p3=

```
If you aren't locked into the idea of using cat to send as many args as the file is long, you may find this method quite flexible. You can pipe file directly to 2.sh 

```
# echo -e "a/b\n'c/d e/f'" >lines.txt

fn2.sh() { set -f              # disable pathname expansion 
   while IFS= read -r line; do # -r prevents expansion of such things as \n
       printf "%s\n" "$line"   # printf is more robust than echo (when dealing with unknown data)
   done 
}
< lines.txt fn2.sh             # using redirection 

```