这里的字符串与输入重定向

这里的字符串与输入重定向

以下例子取自 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

相关内容