I am trying to understand the differences between these two similar commands.
aa=$(foo | bar | head -1)
read aa < <(foo | bar | head -1)
<()
requires #!/bin/bash
, but does that make it slower?bash
or sh
processes?I am looking to use the command with the best performance.
lastpipe
is not enabled, there is a process for each pipeline element plus a subshell for either substitution plus the parent process.lastpipe
is enabled, the last element of the pipeline will exec
without forking in both cases, still requiring the same number of processes./dev/fd/*
, the shell will create named pipes for process substitutions instead. This likely affects performance.$(<...)
in everything except Bash that supports it). In mksh and ksh93, there's also the ${ ;}
style command substitution, but each shell implements this differently. In ksh93, it may or may not give a speedup. in mksh, probably not. mksh doesn't support process substitutions, and zsh doesn't support (and has no way of simulating) BASHPID
, so I haven't looked into it.There is nothing intrinsically faster about a command substitution than a process substitution in Bash, but the head
is redundant in the case of read
since you're only reading a single line there. As an aside, always use head -n ...
-- -1
is not portable. Also, don't use read
without -r
unless you want the shell to mangle the input.