bash - zsh 中的 IFS 行为与 bash 不同

标签 bash zsh

foo() {
    local lines=$(ls -l)
    local IFS=$'\n'
    for line in $lines; do
        echo $line
    done
}

在 zsh 中,循环只执行一次,因为 ls -l 命令的输出没有被换行分割,整个文本 block 被传递到 $line。 但是在 bash 中,按预期工作。我怎样才能在两个 shell 中具有完全相同的行为?

我不是在寻找循环“ls”输出的替代解决方案。只是想了解为什么它不能在 zsh 中工作但在 bash 中工作得很好。代替“ls”命令可以是任何其他命令。例如“ps-a”。行为是一样的。输出不按行分割。

谢谢!

最佳答案

默认情况下,ZSH 不拆分单词(与其他 shell 一样):

foo() {
    local lines=$(ls -l)

    local IFS=$'\n'
    if [ $ZSH_VERSION ]; then
      setopt sh_word_split
    fi

    for line in $lines; do
        echo line: $line
    done
}

foo

感谢@chris-johnsen his answer .我支持他更好地使用数组(在可能的情况下)的论点:

local lines=("$(ls -l)")

其他选项是(仅限 ZSH):

关于bash - zsh 中的 IFS 行为与 bash 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41320199/

相关文章:

linux - 如何打开 xterm -e 'command' 并保留已声明的函数?

bash - 在 Jenkins 的 Bash 脚本中使用环境变量

bash - 我怎样才能对现有的 bash 变量进行 ANSI C 引用?

c - Bash 在简单程序上重新打开 tty

zsh - NVM 不坚持使用 ZSH (oh-my-zsh) 的默认别名

c - 如何在 C 中将 execv 与生成的路径一起使用?

bash - 在 Unix/Bash 中回显文本文件的最后一个字符

git - 如何使用 zsh compinit 启用 git 文件选项卡补全?

emacs - Emacs 中的 zsh 输出垃圾字符

zsh - 在 Mac 上将 fzf 与 tmux 和 zsh 结合使用