Bash Input/Output: Difference between revisions
Line 145: | Line 145: | ||
{{Internal|Bash_read#Confirmation_to_Proceed|Interactively Read Input from stdin}} | {{Internal|Bash_read#Confirmation_to_Proceed|Interactively Read Input from stdin}} | ||
=Redirection Operator (>)= | =Redirection Operator (>)= | ||
{{External|http://tldp.org/LDP/abs/html/io-redirection.html#IOREDIRREF}} | |||
">" is the output redirection operator. | |||
By itself, the ">" redirects the stdout of the command to a file, resetting it to zero length before writing: | |||
<syntaxhighlight lang='bash'> | |||
command > /tmp/some-file | |||
</syntaxhighlight> | |||
The above command is equivalent to: | |||
<syntaxhighlight lang='bash'> | |||
command 1> /tmp/some-file | |||
</syntaxhighlight> | |||
To redirect and append stdout only to a file: | |||
<syntaxhighlight lang='bash'> | |||
command 1>> /tmp/some-file | |||
</syntaxhighlight> | |||
To redirect stderr only to a file, resetting it to zero length before writing: | |||
<syntaxhighlight lang='bash'> | |||
command 2> /tmp/some-file | |||
</syntaxhighlight> | |||
To redirect and append stderr only to a file: | |||
<syntaxhighlight lang='bash'> | |||
command 2>> /tmp/some-file | |||
</syntaxhighlight> | |||
To redirect both stdout and stderr to a file, resetting it to zero length before writing: | |||
<syntaxhighlight lang='bash'> | |||
command &> /tmp/some-file | |||
</syntaxhighlight> | |||
To redirect stderr to stdout, for example to send error messages to the same place as standard output: | |||
<syntaxhighlight lang='bash'> | |||
command 2>&1 | |||
</syntaxhighlight> | |||
The following syntax is useful to append both stdout and stderr to the same file: | |||
<syntaxhighlight lang='bash'> | |||
command 2>&1 >>/tmp/some-file | |||
</syntaxhighlight> | |||
The following syntax is useful to process in-line both stdout and stderr | |||
<syntaxhighlight lang='bash'> | |||
command 2>&1 | some-processor | |||
</syntaxhighlight> | |||
Bash 4 has the following abbreviation: | |||
<syntaxhighlight lang='bash'> | |||
|& | |||
</syntaxhighlight> for "2>&1 |" |
Revision as of 04:20, 2 January 2021
Internal
Here-Docs
Echo Multiple Lines to stdout
cat <<EOF blah ${some_var} $(some-command) blah EOF
- It will perform variable substitution. If you don't want that, escape \${some_var}.
- `...` sequences should be escaped as shown here: \`...\` otherwise they will executed before the output is sent to stdout.
- \ will join lines. If you want "\" in the output, then you should escape it:
... blah blah \\ ...
Echo Multiple Lines into a File
cat > /tmp/test.txt << EOF
blah
EOF
or
(cat << EOF
blah
EOF
) > /tmp/test.txt
To append:
cat >> /tmp/test.txt << EOF
blah
EOF
Iterating over Lines from a File
Line Processing Takes Place in a Subprocess
The following sequence is simple, but the line processing is done in a different sub-shell than the one that invoked cat
:
cat ./file | while read line; do
echo ">>> ${line}"
done
Iterating over Lines from a File in the Same bash Process
With for
Note that the following approach works better for small files. If the file is large, the content will be first cached in memory, and it may look like the command is irresponsive:
With sed
This approach has the advantage that lines are read one by one and not buffered:
filename=... line_count=$(wc -l ${filename}) || exit 1 line_count=${line_count% *} line_count=$(echo ${line_count} | sed -e 's/ *//') line_number=1 while [ ${line_number} -le ${line_count} ]; do local line line=$(sed -n ${line_number}p ${filename}) # process line ... ((line_number++)) done
With while
while IFS= read -r line; do
echo ${line}
...
done <<< "$(cat ./myfile.txt)"
Read First Line from a File
head -i <file>
Read the First Line of a Command's Output
bash --version | head -n 1
Extracting a Line Specified by Its Number from a File
With head and tail
Extract line 15 (line numbers are 1-based) with head and tail:
cat ./test.txt | head -15 | tail -1
With sed
echo Formatting
Bold:
echo -e "\033[1msomething bold \033[0m"
Red:
echo -e "\033[31msomething red\033[0m"
Quoted String Expansion
$'\012' # Octal value $'\x0a' # Hexadecimal value
More details:
Interactively Reading from stdin
Redirection Operator (>)
">" is the output redirection operator.
By itself, the ">" redirects the stdout of the command to a file, resetting it to zero length before writing:
command > /tmp/some-file
The above command is equivalent to:
command 1> /tmp/some-file
To redirect and append stdout only to a file:
command 1>> /tmp/some-file
To redirect stderr only to a file, resetting it to zero length before writing:
command 2> /tmp/some-file
To redirect and append stderr only to a file:
command 2>> /tmp/some-file
To redirect both stdout and stderr to a file, resetting it to zero length before writing:
command &> /tmp/some-file
To redirect stderr to stdout, for example to send error messages to the same place as standard output:
command 2>&1
The following syntax is useful to append both stdout and stderr to the same file:
command 2>&1 >>/tmp/some-file
The following syntax is useful to process in-line both stdout and stderr
command 2>&1 | some-processor
Bash 4 has the following abbreviation:
|&
for "2>&1 |"