BSD 版 xargs 与 GNU 版有一个显著的不同——它支持-J
选项。
比如说,你使用 find 命令得到了一个文件列表。你要将它们传递给一个叫concat_files
的程序来处理后生成一个指定的新文件,比如:
concat_files file1 file2 file3 output
而且,这个命令不像 cp 或者 mv 那样,有个-t
参数来把目标文件放到不定长的文件列表之前。总之呢,你不得不构建一行命令,它的中间部分是你会从管道传过去的文件列表。而 GNU xargs 要么全给你放末尾(默认),要么每项执行一次命令(指定-I
时)。而 BSD xargs 则可以用-J
选项指定一个占位符,使用这个占位符指明参数插入的位置:
find ... | xargs -J % concat_files % output
BSD xargs 的另一个特有参数是-o
,作用你们就自己看文档啦=w=
我想在 Linux 上使用 BSD xargs,怎么办呢?在 AUR 里搜索到了这个,但是已经编译不过去了。安装 bmake 后手动边改边编译,最终终于成功编译了 obase 中的大多数工具。我知道的比较有特色的也就这个 xargs 了,于是单独打了个包 bsdxargs,放在我的 lilydjwg 源 里。
附,obase 的补丁:
diff --git a/Makefile b/Makefile
index 2bb18b4..96acf8a 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,8 @@ LIBOBASE=${.CURDIR}/libobase/libobase.a
INCLUDES_libobase=-isystem ${.CURDIR}/libobase/include
COPTS_libobase=-D_GNU_SOURCE
DPLIBS+=${LIBOBASE}
+LDADD+= ${LIBOBASE}
+.export LDADD
.export COPTS DPLIBS HOSTCC HOSTCFLAGS USE_DPADD_MK
SUBDIR=\
diff --git a/src/bin/ls/Makefile b/src/bin/ls/Makefile
index defd607..6ad4725 100644
--- a/src/bin/ls/Makefile
+++ b/src/bin/ls/Makefile
@@ -3,6 +3,6 @@
PROG= ls
SRCS= cmp.c ls.c main.c print.c util.c
DPADD= ${LIBUTIL}
-LDADD= -lutil
+LDADD+= -lutil
.include <bsd.prog.mk>
diff --git a/src/usr.bin/awk/Makefile b/src/usr.bin/awk/Makefile
index 54857d3..9d2d243 100644
--- a/src/usr.bin/awk/Makefile
+++ b/src/usr.bin/awk/Makefile
@@ -2,7 +2,7 @@
PROG= awk
SRCS= ytab.c lex.c b.c main.c parse.c proctab.c tran.c lib.c run.c
-LDADD= -lm
+LDADD+= -lm
DPADD= ${LIBM}
CLEANFILES+=proctab.c maketab ytab.c ytab.h stamp_tabs
CFLAGS+=-I. -I${.CURDIR} -DHAS_ISBLANK -DNDEBUG
diff --git a/src/usr.bin/dc/Makefile b/src/usr.bin/dc/Makefile
index b0a2396..f8ee358 100644
--- a/src/usr.bin/dc/Makefile
+++ b/src/usr.bin/dc/Makefile
@@ -3,7 +3,7 @@
PROG= dc
SRCS= dc.c bcode.c inout.c mem.c stack.c
COPTS+= -Wall
-LDADD= -lcrypto
+LDADD+= -lcrypto
DPADD= ${LIBCRYPTO}
.include <bsd.prog.mk>
diff --git a/src/usr.bin/du/Makefile b/src/usr.bin/du/Makefile
index feb644d..9676f37 100644
--- a/src/usr.bin/du/Makefile
+++ b/src/usr.bin/du/Makefile
@@ -2,6 +2,6 @@
PROG= du
DPADD= ${LIBUTIL}
-LDADD= -lutil
+LDADD+= -lutil
.include <bsd.prog.mk>
diff --git a/src/usr.bin/gzsig/Makefile b/src/usr.bin/gzsig/Makefile
index 0dc7b81..f4f0664 100644
--- a/src/usr.bin/gzsig/Makefile
+++ b/src/usr.bin/gzsig/Makefile
@@ -3,7 +3,7 @@
PROG = gzsig
SRCS = gzsig.c key.c sign.c ssh.c ssh2.c util.c verify.c x509.c
-LDADD = -lcrypto -lm
+LDADD += -lcrypto -lm
DPADD = ${LIBCRYPTO} ${LIBM}
CLEANFILES += TAGS *~
diff --git a/src/usr.bin/lex/Makefile b/src/usr.bin/lex/Makefile
index 080a151..27a783e 100644
--- a/src/usr.bin/lex/Makefile
+++ b/src/usr.bin/lex/Makefile
@@ -17,7 +17,7 @@ SRCS= ccl.c dfa.c ecs.c gen.c main.c misc.c nfa.c parse.c sym.c tblcmp.c \
yylex.c
OBJS+= scan.o skel.o
CLEANFILES+=parse.c parse.h scan.c skel.c y.tab.c y.tab.h
-LDADD= -lfl
+LDADD+= -lfl
DPADD= ${LIBL}
MAN = flex.1
diff --git a/src/usr.bin/m4/Makefile b/src/usr.bin/m4/Makefile
index 7c510f5..16a282c 100644
--- a/src/usr.bin/m4/Makefile
+++ b/src/usr.bin/m4/Makefile
@@ -8,7 +8,7 @@ CFLAGS+=-DEXTENDED -I.
CDIAGFLAGS=-W -Wall -Wstrict-prototypes -pedantic \
-Wno-unused -Wno-char-subscripts -Wno-sign-compare
-LDADD= -ly -lfl -lm
+LDADD+= -ly -lfl -lm
DPADD= ${LIBY} ${LIBL} ${LIBM}
SRCS= eval.c expr.c look.c main.c misc.c gnum4.c trace.c tokenizer.l parser.y
diff --git a/src/usr.bin/make/Makefile b/src/usr.bin/make/Makefile
index a63ed94..1d12280 100644
--- a/src/usr.bin/make/Makefile
+++ b/src/usr.bin/make/Makefile
@@ -14,7 +14,7 @@ CDEFS+=-DHAS_EXTENDED_GETCWD
CFLAGS+=${CDEFS}
HOSTCFLAGS+=${CDEFS}
-LDADD= -lrt
+LDADD+= -lrt
SRCS= arch.c buf.c cmd_exec.c compat.c cond.c dir.c direxpand.c engine.c \
error.c for.c init.c job.c lowparse.c main.c make.c memory.c parse.c \
diff --git a/src/usr.bin/mandoc/Makefile b/src/usr.bin/mandoc/Makefile
index cf565fd..6086a81 100644
--- a/src/usr.bin/mandoc/Makefile
+++ b/src/usr.bin/mandoc/Makefile
@@ -9,7 +9,7 @@ CFLAGS+=-W -Wall -Wstrict-prototypes
CFLAGS+=-Wno-unused-parameter
.endif
-LDADD= -ldb
+LDADD+= -ldb
SRCS= roff.c tbl.c tbl_opts.c tbl_layout.c tbl_data.c eqn.c mandoc.c read.c
SRCS+= mdoc_macro.c mdoc.c mdoc_hash.c \
diff --git a/src/usr.bin/script/Makefile b/src/usr.bin/script/Makefile
index d7dbf01..8837084 100644
--- a/src/usr.bin/script/Makefile
+++ b/src/usr.bin/script/Makefile
@@ -1,7 +1,7 @@
# $OpenBSD: Makefile,v 1.3 1997/09/21 11:50:42 deraadt Exp $
PROG= script
-LDADD= -lutil
+LDADD+= -lutil
DPADD= ${LIBUTIL}
.include <bsd.prog.mk>
diff --git a/src/usr.bin/ul/Makefile b/src/usr.bin/ul/Makefile
index bab290c..12295ec 100644
--- a/src/usr.bin/ul/Makefile
+++ b/src/usr.bin/ul/Makefile
@@ -2,6 +2,6 @@
PROG= ul
DPADD= ${LIBCURSES}
-LDADD= -lcurses
+LDADD+= -lcurses
.include <bsd.prog.mk>
diff --git a/src/usr.bin/vacation/Makefile b/src/usr.bin/vacation/Makefile
index 6f08990..f9ef0d6 100644
--- a/src/usr.bin/vacation/Makefile
+++ b/src/usr.bin/vacation/Makefile
@@ -1,6 +1,6 @@
# $OpenBSD: Makefile,v 1.3 1997/09/21 11:51:42 deraadt Exp $
PROG= vacation
-LDADD= -ldb
+LDADD+= -ldb
.include <bsd.prog.mk>
diff --git a/src/usr.bin/wc/Makefile b/src/usr.bin/wc/Makefile
index 3f3c619..0f3d1a2 100644
--- a/src/usr.bin/wc/Makefile
+++ b/src/usr.bin/wc/Makefile
@@ -2,6 +2,6 @@
PROG= wc
DPADD= ${LIBUTIL}
-LDADD= -lutil
+LDADD+= -lutil
.include <bsd.prog.mk>
参见