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"。行为是一样的。输出不是按行分割的。
谢谢!
答案 0 :(得分:1)
默认情况下,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 line in ${=lines}; do
(注意添加的等号)