07-22-2005
FYI. From
BASH Frequently-Asked Questions
Quote:
E4) If I pipe the output of a command into `read variable', why doesn't
the output show up in $variable when the read command finishes?
This has to do with the parent-child relationship between Unix
processes. It affects all commands run in pipelines, not just
simple calls to `read'. For example, piping a command's output
into a `while' loop that repeatedly calls `read' will result in
the same behavior.
Each element of a pipeline runs in a separate process, a child of
the shell running the pipeline. A subprocess cannot affect its
parent's environment. When the `read' command sets the variable
to the input, that variable is set only in the subshell, not the
parent shell. When the subshell exits, the value of the variable
is lost.
Many pipelines that end with `read variable' can be converted
into command substitutions, which will capture the output of
a specified command. The output can then be assigned to a
variable:
grep ^gnu /usr/lib/news/active | wc -l | read ngroup
can be converted into
ngroup=$(grep ^gnu /usr/lib/news/active | wc -l)
This does not, unfortunately, work to split the text among
multiple variables, as read does when given multiple variable
arguments. If you need to do this, you can either use the
command substitution above to read the output into a variable
and chop up the variable using the bash pattern removal
expansion operators or use some variant of the following
approach.
Say /usr/local/bin/ipaddr is the following shell script:
#! /bin/sh
host `hostname` | awk '/address/ {print $NF}'
Instead of using
/usr/local/bin/ipaddr | read A B C D
to break the local machine's IP address into separate octets, use
OIFS="$IFS"
IFS=.
set -- $(/usr/local/bin/ipaddr)
IFS="$OIFS"
A="$1" B="$2" C="$3" D="$4"
Beware, however, that this will change the shell's positional
parameters. If you need them, you should save them before doing
this.
This is the general approach -- in most cases you will not need to
set $IFS to a different value.
Some other user-supplied alternatives include:
read A B C D << HERE
$(IFS=.; echo $(/usr/local/bin/ipaddr))
HERE
and, where process substitution is available,
read A B C D < <(IFS=.; echo $(/usr/local/bin/ipaddr))
10 More Discussions You Might Find Interesting
1. Shell Programming and Scripting
I have file which is space filled likE below
Note: here spaces are replaced by |.
When I use read command to read this file all the spaces are truncated only the default space is not removed. The output is
Note: here spaces are replaced by |.
Can this default truncation be override? (4 Replies)
Discussion started by: COD
4 Replies
2. Shell Programming and Scripting
Hi all,
What does -u option indicates in read command.
while read -u var1
do
.
.
done < file.txt (1 Reply)
Discussion started by: krishna_gnv
1 Replies
3. Shell Programming and Scripting
hi all
iam not able use read command in the while loop in the following program
while read line
do
echo $line
echo "enter name"
read name
echo "your have entered $name"
done < work.txt
THE READ COMMAND INSIDE THE WHILE LOOP IS NOT WORKING, IS ANY OTHER WAY TO SOLVE THIS... (7 Replies)
Discussion started by: avi.skynet
7 Replies
4. Shell Programming and Scripting
Is there a way to use the READ command and force the user to enter a non-zero length string? If the user enters a zero length string the user input is rejected.
code:
print "what is the answer: \n"
read answer (2 Replies)
Discussion started by: djehresmann
2 Replies
5. UNIX for Dummies Questions & Answers
Hi everyone,
I have problem while writing a shell script for linux (Red Hat).
First I need to create a read command. I tried to google this but so far I can't sort this out. I hope you will be able to help me.
I have to read a file like this :
GESTION_DATA_SET_variable1_variable2
... (2 Replies)
Discussion started by: Aswex
2 Replies
6. UNIX for Dummies Questions & Answers
Hey, guys!
Trying to research this is such a pain since the read command itself is a common word. Try searching "unix OR linux read command examples" or using the command substitution keyword. :eek:
So, I wanted to use a command statement similar to the following.
This is kinda taken... (2 Replies)
Discussion started by: ProGrammar
2 Replies
7. Shell Programming and Scripting
Hello guys,
I am trying to a script that reads from key board and use the entered value in the next step.
Example: enter folder name
read $folder (i will give work)
cd /main/$folder/
pwd
it should print /main/work
---------- Post updated at 03:31 PM ----------... (1 Reply)
Discussion started by: sharath24
1 Replies
8. Shell Programming and Scripting
Hi,
I am facing issues with the below:
I have a lookup file say lookup.lkp.This lookup.lkp file contains strings delimited by comma(,).
Now i want to read this command from file and execute it.
So my code below is :
Contents in the lookup.lkp file is :
c_e,m,a,`cd $BOX | ls cef_*|tail... (7 Replies)
Discussion started by: vital_parsley
7 Replies
9. UNIX for Beginners Questions & Answers
Is there a way to make the input of the read command (or some similar command that I'm unaware of) not visible, or with an astrix??
An example:
#!/bin/bash
# Example
echo; echo "Who are you??"; read name
if ;
then echo "Welcome, the terminal is yours."; exit
else "Stranger... (2 Replies)
Discussion started by: Huitzilopochtli
2 Replies
10. UNIX for Beginners Questions & Answers
Trying to use the read command. How do you add a 2nd option? In this example I'd like to offer two options, pre and post. If you answer pre, you get one output but if you answer post, you get another output.
echo Is this pre or post?
read pre
if
then echo You have typed pre.
fi (6 Replies)
Discussion started by: jimmyf
6 Replies
read(1) User Commands read(1)
NAME
read - read a line from standard input
SYNOPSIS
/usr/bin/read [-r] var...
sh
read name...
csh
set variable = $<
ksh
read [ -prsu [n]] [ name ? prompt] [name...]
DESCRIPTION
/usr/bin/read
The read utility will read a single line from standard input.
By default, unless the -r option is specified, backslash () acts as an escape character. If standard input is a terminal device and the
invoking shell is interactive, read will prompt for a continuation line when:
o The shell reads an input line ending with a backslash, unless the -r option is specified.
o A here-document is not terminated after a NEWLINE character is entered.
The line will be split into fields as in the shell. The first field will be assigned to the first variable var, the second field to the
second variable var, and so forth. If there are fewer var operands specified than there are fields, the leftover fields and their interven-
ing separators will be assigned to the last var. If there are fewer fields than vars, the remaining vars will be set to empty strings.
The setting of variables specified by the var operands will affect the current shell execution environment. If it is called in a subshell
or separate utility execution environment, such as one of the following:
(read foo)
nohup read ...
find . -exec read ... ;
it will not affect the shell variables in the caller's environment.
The standard input must be a text file.
sh
One line is read from the standard input and, using the internal field separator, IFS (normally space or tab), to delimit word boundaries,
the first word is assigned to the first name, the second word to the second name, and so on, with leftover words assigned to the last name.
Lines can be continued using
ewline. Characters other than NEWLINE can be quoted by preceding them with a backslash. These backslashes
are removed before words are assigned to names, and no interpretation is done on the character that follows the backslash. The return code
is 0, unless an end-of-file is encountered.
csh
The notation:
set variable = $<
loads one line of standard input as the value for variable. (See csh(1)).
ksh
The shell input mechanism. One line is read and is broken up into fields using the characters in IFS as separators. The escape character,
(), is used to remove any special meaning for the next character and for line continuation. In raw mode, -r, the character is not
treated specially. The first field is assigned to the first name, the second field to the second name, and so on, with leftover fields
assigned to the last name. The -p option causes the input line to be taken from the input pipe of a process spawned by the shell using |&.
If the -s flag is present, the input will be saved as a command in the history file. The flag -u can be used to specify a one digit file
descriptor unit n to read from. The file descriptor can be opened with the exec special command. The default value of n is 0. If name is
omitted, REPLY is used as the default name. The exit status is 0 unless the input file is not open for reading or an end-of-file is encoun-
tered. An end-of-file with the -p option causes cleanup for this process so that another can be spawned. If the first argument contains a
?, the remainder of this word is used as a prompt on standard error when the shell is interactive. The exit status is 0 unless an end-of-
file is encountered.
OPTIONS
The following option is supported:
-r Does not treat a backslash character in any special way. Considers each backslash to be part of the input line.
OPERANDS
The following operand is supported:
var The name of an existing or non-existing shell variable.
EXAMPLES
Example 1: An example of the read command
The following example for /usr/bin/read prints a file with the first field of each line moved to the end of the line:
example% while read -r xx yy
do
printf "%s %s
" "$yy" "$xx"
done < input_file
ENVIRONMENT VARIABLES
See environ(5) for descriptions of the following environment variables that affect the execution of read: LANG, LC_ALL, LC_CTYPE, LC_MES-
SAGES, and NLSPATH.
IFS Determines the internal field separators used to delimit fields.
PS2 Provides the prompt string that an interactive shell will write to standard error when a line ending with a backslash is read and
the -r option was not specified, or if a here-document is not terminated after a newline character is entered.
EXIT STATUS
The following exit values are returned:
0 Successful completion.
>0 End-of-file was detected or an error occurred.
ATTRIBUTES
See attributes(5) for descriptions of the following attributes:
+-----------------------------+-----------------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+-----------------------------+-----------------------------+
|Availability |SUNWcsu |
+-----------------------------+-----------------------------+
|Interface Stability |Standard |
+-----------------------------+-----------------------------+
SEE ALSO
csh(1), ksh(1), line(1), set(1), sh(1), attributes(5), environ(5), standards(5)
SunOS 5.10 28 Mar 1995 read(1)