Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
843 views
in Technique[技术] by (71.8m points)

bash - What is the difference between "$(cat file)", "$(<file)" and "read ... < file" for files with one line?

I have an input file that contains only one line:

$ cat input
foo bar

I want to use this line in my script and there are 3 ways to get it that I know of:

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

For example, using command substitution means I spawn a subshell, whereas with read I do not, correct? What other differences are there and is one way preferred over the others? I also noticed (with strace) that only read triggers the syscall openat for some reason. How is it possible that the others don't?

$ strace ./script |& grep input
read(3, "#!/usr/bin/env bash

cat > input"..., 80) = 80
read(255, "#!/usr/bin/env bash

cat > input"..., 167) = 167
read(255, "
line=$(cat input)
line=$(<input"..., 167) = 60
read(255, "line=$(<input)
IFS= read -r line"..., 167) = 41
read(255, "IFS= read -r line < input
", 167) = 26
openat(AT_FDCWD, "input", O_RDONLY)     = 3
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
  • line=$(cat input) is the POSIX way of reading the entire file. It requires a fork.

  • line=$(< input) is a marginally more efficient Bashism for reading the entire file. It also forks, but doesn't have to execve.

  • Not mentioned but mapfile/readarray are significantly more efficient Bashisms for reading the entire file line-by-line into arrays. No forks.

  • IFS= read -r line < input is the POSIX way of reading a single line without a subshell. No forks.

The reason why you only see the latter opening the file is simply that the others do it in a subshell, and you haven't specified -f to trace child processes.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...