zsh中的IFS与bash的行为不同

zsh中的IFS与bash的行为不同,第1张

概述foo() { local lines=$(ls -l) local IFS=$'\n' for line in $lines; do echo $line done} 在zsh中,循环只执行一次,因为ls -l命令的输出不会被新行拆分,整个文本块会传递到$line. 但是在bash中,按预期工作.我怎样才能在两个shell中都有完全相同的行为?
foo() {    local lines=$(ls -l)    local IFS=$'\n'    for line in $lines; do        echo $line    done}

在zsh中,循环只执行一次,因为ls -l命令的输出不会被新行拆分,整个文本块会传递到$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

积分用his answer转到@ chris-johnsen.我支持他的论点以更好地使用数组(如果可能):

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

其他选项是(仅限ZSH):

> local lines =(“${(f)$(ls -l)}”),其中(f) is shorthand for (ps:\n:)> for $in {$= lines};做(注意添加等号)

总结

以上是内存溢出为你收集整理的zsh中的IFS与bash的行为不同全部内容,希望文章能够帮你解决zsh中的IFS与bash的行为不同所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1017315.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存