83

Why is the command md5sum <<< 'ddd' (output: d6d88f2e50080b9602da53dac1102762 -) right, and md5sum << 'ddd' not?

What does <<< mean?

1

2 Answers 2

62

The <<< starts a “here string”: The string is expanded and fed to the program’s stdin. (In your case, there is not much of expansion happening.) It is equivalent to this:

echo ddd | md5sum

On the other hand, << starts a here document. All the following lines up to one containing the marker ddd will comprise the input of the program. (You should use a marker that is not likely to appear in your data.) You could achieve the same effect as above like this:

md5sum <<END
ddd
END

There is one difference between <<END and <<'END': Without the quotes, any variables, escape sequences etc. in the here document will be expanded as usual.

4
  • 6
    Where it's not equivalent is that except in rc, <<< (like <<) uses a temporary file so can be used by commands that lseek their stdin. Commented May 19, 2013 at 22:05
  • @Stéphane Chazelas, where this temporary is created? I've tried to start using << and in other window typed ls -la in same folder and have not seen any new files (Mac OS). Commented Jan 10, 2020 at 6:39
  • 2
    @AlexeiMartianov, it's deleted after it's opened but before it's being used which ensures it's not left behind, so it's only visible on the file system for a very short time. On Linux ls -ld /proc/self/fd/0 <<< text will show you its original path with a " (deleted)" appended. It's generally in $TMPDIR or /tmp if $TMPDIR is not set. zsh uses $TMPPREFIX instead (a prefix, not a directory). Commented Jan 10, 2020 at 6:54
  • So would it be correct to say that a here-string <<< doesn't need closing, and is typically all on a single line? Commented May 12, 2022 at 7:12
42

<<< introduces a here string: the string after <<< is passed as input to the command. This originates in Byron Rakitzis's implementation of rc (a Plan 9 shell) for Unix, and is also present in zsh, ksh93, mksh, yash and bash.

<< introduces a here document: subsequent lines of the shell script are passed as input to the command, and the string after << is a terminator. Here documents work in all Bourne-style shells (Bourne, POSIX, ash, bash, ksh, zsh, …), C-style shells (csh, tcsh), and shells derived from the Plan 9 shell (rc, es, akanga).

2
  • 5
    No, <<< is not a ksh extension, the path is rc -> zsh -> ksh93 -> bash (ksh release notes acknowledge for once borrowing the feature from zsh). << also works in rc style shells Commented May 19, 2013 at 21:52
  • There's a difference between the rc and zsh <<< though in that rc's doesn't include a trailing newline character and doesn't use a temp file (uses a pipe and an extra process feeding it at least in the port to Linux). Commented May 19, 2013 at 22:02

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .