gpt4 book ai didi

shell - xargs 在换行符处拆分而不是空格

转载 作者:行者123 更新时间:2023-12-03 14:48:59 30 4
gpt4 key购买 nike

简而言之,这是我的问题

$ echo 'for i in $@; do echo arg: $i; done; echo DONE' > /tmp/test.sh
$ echo "ac\nbc\ncc\n" | xargs bash /tmp/test.sh
arg: ac
arg: bc
arg: cc
DONE

这是我所期望的,但是
$ echo "ac s\nbc s\ncc s\n" | xargs -d \n bash /tmp/test.sh
arg: ac
arg: s
arg: bc
arg: s
arg: cc
arg: s
DONE

不应该是输出吗?
arg: ac s
arg: bc s
arg: cc s
DONE

如何使用 xargs 获得第二个输出?

最佳答案

尝试:

printf %b 'ac s\nbc s\ncc s\n' | xargs -d '\n' bash /tmp/test.sh

你忽略了引用 \n 传递给 -d ,这意味着只有 n而不是 \n已传递给 xargs作为分隔符 - shell “吃掉”了 \ (当 shell 解析一个未加引号的字符串时, \ 用作转义字符;如果在这种情况下 \ - n 后面是一个普通字符 - 只使用那个普通字符)。

还要注意@glenn jackman 的建议,双引号 $@在脚本内部(或完全省略 in "$@" 部分)。

另外: xargs -d是 GNU 扩展 ,例如,它不适用于 FreeBSD/macOS。要让它在那里工作,请参阅@glenn jackman 的 xargs -0基于的解决方案。

请注意,我正在使用 printf而不是 echo确保 \n字符串中的实例在所有类似 Bourne 的 shell 中被解释为换行符:
bashksh [1], echo默认为不解释 \ - 基于转义序列(你必须使用 -e 来实现) - 与 zsh 不同和严格符合 POSIX 的 shell,例如 dash .
因此, printf是更便携的选择。

[1] 根据手册, kshecho内置表现出与主机平台的外部相同的行为 echo公用事业;虽然这可能因平台而异,但 Linux 和 BSD/macOS 实现不会解释 \默认情况下转义序列。

关于shell - xargs 在换行符处拆分而不是空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23142776/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com