139

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?

| improve this question | | | | |
  • 2
    it seems < is for passing file (or directory), << @ for passing multiple lines (similar to the banner command in cisco switches; as terminated by a custom string @ in this case), and <<< to pass a string (instead of file). test them yourself with cat and you'll grasp it very quickly. – user86041 Oct 5 '17 at 10:32
190

Others have answered the basic question: what is it? 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!

| improve this answer | | | | |
  • 10
    In addition to here-strings, process substutitions are very useful for the same reasons. – glenn jackman Jun 22 '13 at 18:32
  • 6
    This is a fantastic explanation of <<< as well as pipes and sub-shells! I learned both from this. – David Mann May 12 '17 at 1:29
  • 1
    One note, with the simple 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 9 '17 at 20:00
  • 1
    First the here string is a single string so if it contains whitespace you need quotes. Second the read command doesn't output anything so you'll have to clarify "nothing" – glenn jackman May 23 '18 at 21:43
  • 2
    Very interesting. The case you give does not result in unexpected behavior using zsh. – Ryan Ward May 8 '19 at 21:00
88

<<< 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
 ...
| improve this answer | | | | |
  • 5
    Is there a reason why someone would want cat < /etc/fstab instead of just cat /etc/fstab? Or is cat just a suboptimal example here? – Griddo Jul 31 '18 at 7:06
  • In the first case, cat opens the file, and in the second case, the shell opens the file, passing it as cat's standard input. quote from unix.stackexchange.com/questions/258931/… – star Apr 19 '19 at 0:53
  • 5
    I can't think of a reason why 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 9 '19 at 3:43
16

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.
| improve this answer | | | | |
5

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.

| improve this answer | | | | |

Not the answer you're looking for? Browse other questions tagged or ask your own question.