Отличный ответ. Спасибо!

я есть входной файл, который содержит только одну строку:

$ cat input
foo bar

Я хочу использовать эту строку в моем скрипте, и есть 3 способа получить это, о которых я знаю:

line=$(cat input)
line=$(<input)
IFS= read -r line < input

Например, использование подстановки команд означает, что я порождаю подоболочку, тогда как сread Я не правильно? Какие есть другие различия, и какой из них предпочтительнее других? Я также заметил (сstrace) только этоread запускает системный вызовopenat по какой-то причине. Как это возможно, что другие не делают?

$ strace ./script |& grep input
read(3, "#!/usr/bin/env bash\n\ncat > input"..., 80) = 80
read(255, "#!/usr/bin/env bash\n\ncat > input"..., 167) = 167
read(255, "\nline=$(cat input)\nline=$(<input"..., 167) = 60
read(255, "line=$(<input)\nIFS= read -r line"..., 167) = 41
read(255, "IFS= read -r line < input\n", 167) = 26
openat(AT_FDCWD, "input", O_RDONLY)     = 3

Ответы на вопрос(1)

Ваш ответ на вопрос