What does <<< mean?

What does <<< mean? Here is an example:

$ sed 's/a/b/g' <<< "aaa"

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?

Asked By: Daniel Jonsson


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.

Answered By: cuonglm

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:


   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.

Answered By: slm

<<< 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 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
bar bar
foo foo

< 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
Answered By: user26112

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!

Answered By: glenn jackman
Categories: Answers Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.