What does <<< mean? Here is an example:
$ sed 's/a/b/g' <<< "aaa"
bbb
Is it something general that works with more Linux commands?
It looks like it's feeding the sed
program with the string aaa
, but isn't << or < usually used for that?
What does <<< mean? Here is an example:
$ sed 's/a/b/g' <<< "aaa"
bbb
Is it something general that works with more Linux commands?
It looks like it's feeding the sed
program with the string aaa
, but isn't << or < usually used for that?
Others have answered the basic question: What is it? (Answer: It's a here string.)
Let's look at why it's useful.
You can also feed a string to a command's stdin like this:
echo "$string" | command
However in Bash, introducing a pipe means the individual commands are run in subshells. Consider this:
echo "hello world" | read first second
echo $second $first
The output of the 2nd echo command prints just a single space. Whaaaa? What happened to my variables? Because the read command is in a pipeline, it is run in a subshell. It correctly reads 2 words from its stdin and assigns to the variables. But then the command completes, the subshell exits and the variables are lost.
Sometimes you can work around this with braces:
echo "hello world" | {
read first second
echo $second $first
}
That's OK if your need for the values is contained, but you still don't have those variables in the current shell of your script.
To remedy this confusing situation, use a here string:
read first second <<< "hello world"
echo $second $first
Ah, much better!
echo ...|read
example, the pipeline can work to set the variables in the current shell if you (1) enable the "lastpipe" shell option (shopt -s lastpipe
) and (2) disable job control (set +m
)
– glenn jackman
Aug 09 '17 at 20:00
dradcliffe:~$ read first second <<< big joe // nothing
– Dean Radcliffe
May 23 '18 at 21:07
<<<
denotes a here string.
$ cat <<< 'hi there'
hi there
It passes the word on the right to the standard input of the command on the left.
<<
denotes a here document.
$ cat <<EOF
> hi
> there
> EOF
hi
there
EOF
can be any word.
Here documents are commonly used in shell scripts to create whole files or to display long messages.
cat > some-file <<FILE
foo
bar
bar bar
foo foo
FILE
<
passes the contents of a file to a command's standard input.
$ cat < /etc/fstab
/dev/sda2 /boot ext4 nosuid,noexec,nodev,rw,noatime,nodiratime 0 2
/dev/sda4 / ext4 rw,noatime,nodiratime, 0 1
/dev/sdb5 /var ext4 nosuid,noexec,nodev,rw,relatime 0 2
...
cat < /etc/fstab
instead of just cat /etc/fstab
? Or is cat
just a suboptimal example here?
– Gerrit-K
Jul 31 '18 at 07:06
cat < file
would ever be better than cat file
. However, there are some cases where there is a difference -- for example, grep string file
is different from grep string < file
in that the second form doesn't prefix "file:" in front of every line. "cat file | grep string" is better written as "grep string < file". Not that any of this is worth doing for performance alone these days, but it is better coding practice.
– Brian C
Jul 09 '19 at 03:43
cat < /etc/fstab
, the shell opens the file, passing it as cat
's standard input, whereas in cat /etc/fstab
, cat
opens the file. I think you'd interchanged them.
– Ray Jasson
Jun 05 '21 at 13:11
cat < file > foo
would not create or overwrite foo
if file
could not be opened and so wouldn't potentially zap a file in an error scenario while cat file > foo
would create/overwrite foo
in that case.
– Ed Morton
Dec 26 '21 at 14:09
cat < foo > file
doesn't actually overwrite foo; and If there is an rare error reading the input file, cat foo
is able to report the file name, whereas it cannot when presented with a stream via < file
. Of course, BOTH forms are absolutely terrible shell programming practice and should never be done. Instead, use the cp
command, or output to an intermediate file and use if [ -s foo.tmp ]
to test for output file validity before then moving the output over the top of any existing file called foo.
– Brian C
Dec 27 '21 at 09:37
cat < foo > file
would overwrite foo
, of course it doesn't. You misread my comment, it has nothing to do with overwriting the input file. I was providing a case where cat < file
would be better than cat file
in response to your comment "I can't think of a reason why cat < file would ever be better than cat file"
– Ed Morton
Dec 27 '21 at 12:18
Take a look at the Bash man page. This notation is part of what's called a here documents & here strings. It allows you the ability to generate multi-line data input as one continuous string. The variation you're asking about is called a here string.
excerpt from Bash man page
Here Strings
A variant of here documents, the format is:
<<<word
The word is expanded and supplied to the command on its standard input.
NOTE: For more info you can also check out the Bash Reference Manual which discusses Here Strings.
It means here strings.
<<< strings
The strings is expanded and supplied to the command on its standard input.
In your example, strings aaa
is feed to sed command via stdin.
<
is for passing file (or directory),<< @
for passing multiple lines (similar to thebanner
command in [tag:cisco] switches; as terminated by a custom string@
in this case), and<<<
to pass a string (instead of file). test them yourself withcat
and you'll grasp it very quickly. – Oct 05 '17 at 10:32