以下例子取自 William Shott 的Linux 命令行。这是一个从 /etc/passwd 文件收集用户信息的 shell 脚本。执行此操作的特定用户是从 stdin 读取的。
我的问题是关于第 7 行中使用的“here string”。为了好玩,我尝试使用重定向运算符,但没有奏效。为什么?
PS:我有一些 C++ 背景,所以我希望字符串file_info
可以充当字符串流。
1 #!/bin/bash
2 # read-ifs: read fields from a file
3 FILE=/etc/passwd
4 read -p "Enter a username > " user_name
5 file_info="$(grep "^$user_name:" $FILE)"
6 if [ -n "$file_info" ]; then
7 IFS=":" read user pw uid gid name home shell <<< "$file_info"
8 echo "User = '$user'"
9 echo "UID = '$uid'"
10 echo "GID = '$gid'"
11 echo "Full Name = '$name'"
12 echo "Home Dir. = '$home'"
13 echo "Shell = '$shell'"
14 else
15 echo "No such user '$user_name'" >&2
16 exit 1
17 fi
答案1
如果你做类似的事情
grep "^$user_name:" $FILE | IFS=":" read user pw uid gid name home shell
echo "User = '$user'"
管道的右侧(命令read
)在其自己的子 shell 进程中运行,并且它设置的变量在结束时就消失了,因此echo
只显示空字符串。
但你可以做类似的事情
grep "^$user_name:" $FILE | ( IFS=":" read user pw uid gid name home shell
echo "User = '$user'" )
在这种情况下,整个(
...)
部分在同一个子 shell 中运行,并且变量可供调用echo
。