16

我想要以下行为,而不必使用选项明确指定它:

xargs -d '\n'

与大多数命令不同,您不能只使用别名,因为管道无法识别别名(作为旁注,为什么要这样设计?)。我也尝试过创建自己的~/bin/xargs脚本,但我认为这并不像将“$@”作为脚本中的字符串读取那么简单。

有什么建议可以让分隔符默认成为换行符吗?find ... -print0 | xargs -0当我在路径中有空格时(并且 using有其他不需要的影响),我不想得到一堆错误。

更新

我的 shell 脚本尝试是这样的:

/usr/local/bin/xargs -d '\n' "$@"
4

3 回答 3

14

xargs -d '\n' -n1 echo在命令行上进行了测试,它像宣传的那样工作;将输入分解为单行并回显它。

在变量赋值期间,您可能会被关于 shell 转义的假设所困扰。例如,如果您的 shell 脚本与此类似:

CMD="xargs -d '\n' -n1 echo"
猫输入文件 | $CMD

然后会发生错误,因为整个 CMD 字符串周围的双引号保留了分隔符中的单引号和反斜杠。

如果将 xargs 命令括在引号内,则可以将其更改为以下内容(无单引号)

CMD="xargs -d \n -n1 echo"
猫输入文件 | $CMD

它可能会根据您的需要运行。

在 CentOS 6.4、xargs 版本 4.4.2 上测试

于 2013-11-04T17:51:34.957 回答
8

如果您的版本xargs不支持设置不同的分隔符(例如 2011 FreeBSD 服务器上的分隔符...),您可以使用tr将您的分隔符变成可以使用的东西xargsxargs如果您的输入包含您认为是分隔符的字符(例如空格),您可能需要在前后使用一些翻译,或者您可以简单地将分隔符翻译为NULL/0x0并将-0参数传递给xargs.

这是一个使用xargs在 $PATH 中查找任何可能成为 shell 的文件的示例(我在这里的原因,然后我想出了另一个答案):
echo $PATH | tr ':' '\0' | xargs -0 ls | grep sh | sort

于 2018-12-03T18:45:59.527 回答
1

我有一个简短的脚本,其中包含我最喜欢的默认值,我的系统上的所有 shell 都可以访问(在不同的时间我使用 Dash、Bash 和 Fish)~/binPATH它很小:

!/usr/bin/env sh
exec xargs -rd\\n "$@"

调用该脚本x以避免与期望标准xargs默认值的脚本发生冲突。如果您尝试替换xargs自己,我不建议这样做,请确保您~/bin在 PATH 中的显示高于 system xargswhich -a xargs告诉我唯一xargs存在/usr/bin/xargs于我的系统中,所以我知道我的主目录/home/stephen/bin,必须出现在它之前,如下所示:

$ echo "$PATH"
/home/stephen/bin:...:/usr/bin:...

无论哪种方式,作为所有程序都可以访问的脚本,这意味着您可以执行类似find|x grepsh -c 'x ...'.

如果您使用 Bash 并且更喜欢别名,您也可以只使用:

alias x=xargs -rd\\n\ # \n delim, don't run on empty in, + alias expansion

注意别名扩展的尾随空格。这使您可以链接别名。例如,如果除了上述别名之外,我还有一个名为 grep 的别名g,则以下内容将起作用:

# extended regex, skip binaries, devices, sockets, & dirs, colored, & line
# -buffered. use a non-canonical alias instead of GREP_OPTIONS which may wreck
# assuming scripts
alias g='grep -EID skip -d skip --color=auto --line-buffered'

$ find|x g foo

x/ xargsscript 方法本身不能有效地做到这一点。

由于我在 shell 之间切换并主要使用一台 PC,因此我将少数我需要的别名作为单独的脚本保存在~/binhelper 脚本中,以及与 shell 无关的别名,该脚本~/.sh_aliases~/.shrc,提供~/.bashrc,并且~/.config/fish/config.fish它们都支持类似 Bash 的别名语法. 如果我经常在多台 PC 上工作,我可能会尝试将它们整合到一起~/.bashrc

于 2016-05-01T00:01:23.373 回答