IFS变量是否在以下变化?

时间:2015-05-01 06:05:27

标签: linux bash shell ifs

以下代码片段用于确定文件系统中文件所在位置的路径和文件名。

for index in "${!files[@]}"

    do
    (find . -type f -name "${files[index]}" -print0) 2>&1 | while IFS= read -r -d $'\0' line; do
        if [[ ${line} == ${search_pattern}* ]]
        then
             relative_path=$(echo "$line"|awk '{print substr($0,2)}')
             file_path=$(echo "$(pwd)$relative_path" |awk -F/ '{$NF=""; print $0}'|sed -e 's/ /\//g')
             file_name=$(echo "$(pwd)$relative_path" |awk -F/ '{print $NF}')
    .................................................................

我的问题是关于行,

"while IFS= read -r -d $'\0' line; do"

之前我在find命令中使用for循环。但是有一个关于stackoverflow的帖子,这是更好,更正确的。我试过了,它有效,但不太明白。这行是否会以任何方式改变IFS会改变主shell的效果?我试图解决这个问题,因为我不太熟悉SHELL脚本,我无法理解这一行。

我不想在生产系统中部署它,然后发现其他脚本失败,因为IFS变量已被更改。

1 个答案:

答案 0 :(得分:2)

当您使用read命令执行与{{1}}内联的分配时,变量的值会在命令持续时间内更改,但在命令完成后不会保持更改。

引用Simple Commands in the spec的相关部分(强调我的):

  

如果没有命令名称结果,变量赋值将影响当前的执行环境。否则,应为命令的执行环境导出变量赋值,并且不影响 当前执行环境(特殊构建除外)插件)。如果任何变量赋值尝试将值赋给只读变量,则应发生变量赋值错误。请参阅Shell错误的后果,了解这些错误的后果。

Unix & Linux Stack Exchange上有一系列与此问题相关的答案。