【问题标题】:environment scope in loop (for vs. while)循环中的环境范围(for vs. while)
【发布时间】:2023-04-02 05:10:01
【问题描述】:

我想在一个目录中获取文件,我试图让它与这个循环一起工作:

ls -1 $HOME/.bash_complete.d |while read f; do
    . $HOME/.bash_complete.d/$f
done

虽然脚本似乎已执行,但其中的任何 export foo=bar 都不存在于 env 中

下面是 for 对应的:

for f in $HOME/.bash_complete.d/*; do
    . $f
done

按我的预期工作。是否涉及范围?

【问题讨论】:

    标签: bash loops while-loop


    【解决方案1】:

    -l 不是必需的,它提供了很长的文件列表。只需要文件的名称,可以通过简单的ls 命令获得

    ls $HOME/.bash_complete.d |while read f; do
        echo $HOME/.bash_complete.d/$f
        $HOME/.bash_complete.d/$f
    done
    

    【讨论】:

    • 它是-1(一),没有source执行文件什么都不做
    • 不是. $f 而不是. $HOME/.bash_complete.d/$f
    【解决方案2】:

    参见http://mywiki.wooledge.org/BashFAQ/024Bash Script: While-Loop Subshell Dilemma 的答案(这个问题是重复的),while 循环中的所有内容都在子shell 中执行,因此它有自己的范围。在这个作用域中声明的变量在作用域外是不可见的。

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多