如何在zsh中迭代命令输出的所有行?

Ara*_*ion 5 iteration zsh lines

如何使用zsh迭代命令输出的所有行,而不设置IFS?

原因是我想对命令输出的每个文件运行一个命令,其中一些文件包含空格.

例如,给定删除的文件:

foo/bar baz/gamma
Run Code Online (Sandbox Code Playgroud)

也就是说,一个目录'foo',包含一个子目录'bar baz',包含一个文件'gamma'.

然后运行:

git ls-files --deleted | xargs ls
Run Code Online (Sandbox Code Playgroud)

将该文件中的报告作为两个文件处理:'foo/bar'和'/ baz/gamma'.

我需要它来处理它作为一个文件:'foo/bar baz/gamma'.

Gil*_*il' 8

如果要对所有行运行一次命令:

ls "${(@f)$(git ls-files --deleted)}"
Run Code Online (Sandbox Code Playgroud)

f 参数扩展标记指对换行命令的输出分开.有一种更通用的形式(@s:||:)可以分割成任意字符串||.该@标志意味着保留空记录.有点令人困惑的是,整个扩展需要在双引号内,以避免IFS拆分命令替换的输出,但它会为每个记录产生单独的单词.

如果你想依次为每一行运行命令,那么便携式习语并不是特别复杂:

git ls-filed --deleted | while IFS= read -r line; do ls $line; done
Run Code Online (Sandbox Code Playgroud)

如果要在命令行长度限制允许的情况下运行命令几次,请使用zargs.

autoload -U zargs
zargs -- "${(@f)$(git ls-files --deleted)}" -- ls
Run Code Online (Sandbox Code Playgroud)


Dan*_* D. 5

使用tr-0的选项xargs,假设这些行不包含\000(NUL),这是一个合理的假设,因为 NUL 是不能出现在文件名中的字符之一:

git ls-files --deleted | tr '\n' '\000' | xargs -0 ls
Run Code Online (Sandbox Code Playgroud)

这会将行: 变成foo/bar baz/gamma\nwhichfoo/bar baz/gamma\000知道xargs -0如何处理