foo() {
local lines=$(ls -l)
local IFS=$'\n'
for line in $lines; do
echo $line
done
}
在 zsh 中,循环只执行一次,因为 for 的输出ls -l
命令不会被新行分割,整个文本块都会传递到 $line 中。
但在 bash 中,可以按预期工作。如何在两个 shell 中具有完全相同的行为?
我不是在寻找循环“ls”输出的替代解决方案。只是想了解为什么它在 zsh 中不起作用但在 bash 中工作得很好。除了“ls”命令之外,还可以使用其他任何命令。例如“ps-a”。行为是一样的。输出不按行分割。
Thanks!
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他的回答。我支持他更好地使用数组的论点(如果可能):
local lines=("$(ls -l)")
其他选项是(仅限 ZSH):
-
local lines=("${(f)$(ls -l)}")
, where (f)是简写(ps:\n:)
-
for line in ${=lines}; do
(注意添加的等号)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)