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):
local lines=("${(f)$(ls -l)}")
,其中(f)
is shorthand for(ps:\n:)
${=lines} 中的行;做
(注意添加的等号)
关于bash - zsh 中的 IFS 行为与 bash 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41320199/