有了 GNU find,就可以很容易地通过管道传输xargs。一个典型的(无用的)例子:
find /var/log -name "*.log" | xargs dirname
Run Code Online (Sandbox Code Playgroud)
这将返回包含某个日志文件的所有目录名称。
同样的命令在 BSD 中find不起作用,结尾为:
usage: dirname path
Run Code Online (Sandbox Code Playgroud)
即xargs无法将文件列表条目传递给dirname.
BSDfind的联机帮助页提到了-exec和-execdir选项,指出“此行为类似于 xargs(1)”。
-exec utility [argument ...] {} + 与 -exec 相同,但每次调用实用程序时,将“{}”替换为尽可能多的路径名。此行为与 xargs(1) 类似。
-execdir utility [argument ...] {} + 与 -execdir 相同,只是“{}”在每次调用实用程序时被替换为尽可能多的路径名。此行为与 xargs(1) 类似。
每次我依靠这两个标志时,我都必须再次阅读文档。我似乎记不起它们的用法了!另外,我还关心 GNU/BSD 系统(主要是 Linux、Open/FreeBSD 和 MacOS)之间的脚本可移植性。
有什么方法可以将 BSD 传输find到xargs,或者-exec确实是唯一的选择?
我编写了这个程序,应该以 exitcode 44 退出:
// prog.S
#include <sys/syscall.h>
.text
.globl _start
_start:
subl $8, %esp
pushl $44
pushl $0
movl $SYS_exit, %eax
int $0x80
Run Code Online (Sandbox Code Playgroud)
我编译了
$ cc prog.S -nostdlib -o a.out
Run Code Online (Sandbox Code Playgroud)
并运行
$./a.out
Run Code Online (Sandbox Code Playgroud)
在 FreeBSD 13.0-RELEASE i386 (clang 11.0.1) 上这样做效果很好。事实上,可执行文件运行并且程序的退出代码应该是 44。
但是,在 OpenBSD 7.0 GENERIC.MP#5 i386(clang 版本 11.1.0)和 NetBSD 9.2 i386(gcc 7.5.0)上执行相同操作时,内核拒绝执行代码,并将其传递给 shell,其中课程失败:
openbsd$ ./a.out
./a.out[1]: syntax error: `(' unexpected
Run Code Online (Sandbox Code Playgroud)
奇怪的是,该文件说它是一个 ELF 二进制文件,因此通常应该由内核执行
openbsd$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped …Run Code Online (Sandbox Code Playgroud) 我写了以下命令
echo -en 'uno\ndue\n' | sed -E 's/^.*(uno|$)/\1/'
Run Code Online (Sandbox Code Playgroud)
期待以下输出
uno
Run Code Online (Sandbox Code Playgroud)
我的 GNU Sed 4.8 确实就是这种情况。
但是,我已经验证 BSD Sed 输出
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
网上有很多守护进程的示例实现.我看到的大多数都不使用守护进程(3)函数在后台运行程序.这只是一个品味,无知的问题,还是有充分的理由来编写我自己的守护进程功能?使用守护进程(3)有特定的缺点吗?它不安全吗?
我一直在用C编写一些套接字代码.我需要修改数据包头并控制它们的发送方式,所以我采用了原始套接字方法.但是,我写的代码不能在BSD系统上编译(Mac OS X/Darwin,FreeBSD等)
我已经对此进行了大量研究,并发现BSD系统无法像Linux(甚至Windows)那样处理原始套接字.从我读过的内容来看,似乎我需要使用bpf(berkley数据包过滤器),但我无法弄清楚bpf是如何工作的,或者我将如何使用原始套接字.
如果有人能对这一点有所了解,我会非常兴奋:D
PS我甚至会对一些显示如何在BSD环境中处理原始套接字的源代码感到满意.它不一定是指导或解释.我只想看看它是如何工作的.
我运行git grep "\<blah\>"规律我的Linux开发服务器上,但我刚发现我不能够使用\<,并\>在Mac(Mac OS X的10.6.8)(无法使用它=没有找到任何东西)。Mac中的正则表达式语法是否不同?
我尝试使用git grep -E "\<blah\>"但无济于事!:-(
在Windows和UNIX上使用C进行网络编程最好(在性能方面)哪些库?
我对高频交易非常感兴趣.
我听说过BSD和POSIX,但我不确定是否有更快的性能特定库?
我正在研究mac OS 10.7.4.使用Xcode 4.3.2.
我有一个来自我的合作伙伴的*.a静态库文件.我想知道它是为哪个架构而构建的.是ARMv6,ARMv7,i386还是其他架构?
是否有任何命令或方法来获取有关文件架构的信息?
我使用以下构造看到了一些BSD代码:
typedef int driver_filter_t(void*);
Run Code Online (Sandbox Code Playgroud)
这究竟是什么意思?我不认为它是一个函数指针,因为否则会是这样的typedef int (*driver_filter_t)(void*),对吧?
我最近开始使用 OpenBSD。我想创建简单的即发即弃容器/VM 或其他东西(它应该用作沙箱)。
用户可以上传他的源代码(C++/Java/Perl),它会在服务器(OpenBSD)上编译,如果编译成功,它应该执行这个文件,然后将结果返回到网页。
我如何在 OpenBSD 中提供这个?
另外,我应该使用 chroot,因为 'jail' 将在 6.0 中删除吗?或者还有其他可能在 OpenBSD 中创建“沙箱”吗?