我想要以下行为,而不必使用选项明确指定它:
xargs -d '\n'
与大多数命令不同,您不能只使用别名,因为管道无法识别别名(作为旁注,为什么这样设计?)。我也尝试创建自己的~/bin/xargs
脚本,但我认为这并不像在脚本中读取“$ @”那样简单。
默认情况下如何使分隔符成为换行符的任何建议?当我在路径中有空格时(我使用find ... -print0 | xargs -0
有其他不需要的效果),我不想得到一堆错误。
更新
我的shell脚本尝试是这样的:
/usr/local/bin/xargs -d '\n' "$@"
答案 0 :(得分:6)
我在命令行上测试了xargs -d '\n' -n1 echo
,它按宣传的方式工作;将输入分成单行并回显它。
在变量赋值期间,有关shell转义的假设可能会被您所咬。例如,如果您的shell脚本与此类似:
CMD =“xargs -d'\ n'-n1 echo”
cat inputfile | $ CMD
然后发生错误,因为整个CMD字符串周围的双引号保留了单引号和分隔符中的反斜杠。
如果您将xargs命令括在引号内,则可以将其更改为以下内容(无单引号)
CMD =“xargs -d \ n -n1 echo”
cat inputfile | $ CMD
它可能会根据您的需要发挥作用。
在CentOS 6.4上测试,xargs版本4.4.2
答案 1 :(得分:1)
我的~/bin
中有PATH
并保留了一个简短的脚本,我的系统上的所有shell都可以访问我最喜欢的默认值(在不同的时间我使用Dash,Bash和Fish)。这很小:
!/usr/bin/env sh
exec xargs -rd\\n "$@"
该脚本名为x
,以避免与期望标准xargs
默认值的脚本冲突。如果您尝试替换我自己不推荐的xargs
,请确保您的~/bin
在您的路径中显示的位置高于系统xargs
。 which -a xargs
告诉我系统中xargs
唯一存在/usr/bin/xargs
因此我知道我的主目录/home/stephen/bin
必须出现在它之前:
$ echo "$PATH"
/home/stephen/bin:...:/usr/bin:...
无论哪种方式,作为所有程序都可以访问的脚本,这意味着您可以执行find|x grep
和sh -c 'x ...'
之类的操作。
如果你使用Bash并且喜欢别名,你也可以使用:
alias x=xargs -rd\\n\ # \n delim, don't run on empty in, + alias expansion
请注意别名扩展的尾随空格。这可以让你链接别名。例如,如果除上述别名之外我有一个名为g
的grep别名,则以下内容可行:
# 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
/ xargs
脚本方法无法有效地完成此操作。
由于我在shell之间切换并且主要使用一台PC,因此我需要将少量别名作为~/bin
中的单独脚本和帮助脚本中的shell不可知别名~/.sh_aliases
保留,其源自~/.shrc
,~/.bashrc
和~/.config/fish/config.fish
因为它们都支持类似Bash的别名语法。如果我经常在多台PC上工作,我可能会尝试将它们合并到~/.bashrc
中。
答案 2 :(得分:1)
如果您的xargs
版本不支持设置其他分隔符(例如2011 FreeBSD服务器上的分隔符...),则可以使用tr
将分隔符变成{{ 1}}可以使用。如果您的输入包含xargs
认为是定界符(例如空格)的字符,或者您可以简单地将定界符转换为xargs
/ NULL
,则可能需要在前后使用一些翻译。将0x0
参数传递给-0
。
这里是一个使用xargs
在$ PATH中查找可能是可能使用的shell的文件的示例(我在这里的原因,然后我想出了另一个答案):
xargs