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>