В дополнение к уже данным ответам:
A source
эквивалентно...
comd="ls"
eval "$comd"
... это...
source <(printf ls)
В случае ls
существенной разницы нет.
Но в случае команды, предназначенной для воздействия на вашу текущую среду(то, что вы обычно намереваетесь использовать при использованииsource
)этот вариант будет делать это (, так как ваше 1-е решение с eval
также будет )в то время как ваш второй подход просто влияет на среду подоболочки, которая не будет доступна после выполнения вашей строки кода.
Вы можете открыть файловые дескрипторы или WP из /proc
, например. /proc/123/fd/0
. В этот момент и MP, и CP будут иметь дескрипторы, открытые для stdin/stdout/stderr WP. Вы можете убить MP, чтобы убедиться, что это есть только у CP.