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'.
如果要对所有行运行一次命令:
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)
使用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\n
whichfoo/bar baz/gamma\000
知道xargs -0
如何处理
归档时间: |
|
查看次数: |
3078 次 |
最近记录: |