如何从shell执行库调用命令?

时间:2018-04-08 15:32:58

标签: c bash shell libraries

很抱歉,如果我觉得这个问题很愚蠢,但我很想知道这件事。

我想简单地计算一个字符串的长度(即哈希值)。所以,我打开了终端并做了这个:

$ apropos length

它返回了我的一堆命令/函数,其末尾附加了(3)(3ssl)。现在, man man 会向我们提供有关这些section numbers含义的信息。

3   Library calls (functions within program libraries)

出于好奇,我只是尝试了所有这些命令(希望至少有一个可以工作)

strcspn (3)          - get length of a prefix substring
strlen (3)           - calculate the length of a string
strnlen (3)          - determine the length of a fixed-size string
strspn (3)           - get length of a prefix substring
wcslen (3)           - determine the length of a wide-character string
wcsnlen (3)          - determine the length of a fixed-size wide-character string

并且每个命令都没有相同的错误

$ strnlen HelloWorld 
$ strnlen: command not found

嗯,我知道 how to find length of string in shell 使用wc -mexpr length和其他解决方法。但是,

是否可以编写一个可以在内部调用这些库命令并完成任务的bash脚本?

1 个答案:

答案 0 :(得分:2)

你不能从你的Bash shell执行任何库函数(一般情况下) - 当然不包括shell调用的许多库函数(例如它的cd内置函数将调用{ {3}}系统调用)。

你应该使用一些程序(通常由C编译器生成的一些chdir(2),或其他一些编译语言,如Go,Ocaml,C ++,Rust,...)来调用这些功能。一旦你有了一个程序,你的shell就会使用executable然后fork(2)来运行它。

有些炮弹(例如execve(2))也接受zsh。你可以编写(在C中,然后编译它)一个扩展,创建它的插件并加载该插件。

实际上,要从shell运行plugins函数,您应该编写一些调用它的C源代码(例如yourprog.c),将该源代码编译为wcslen(3)可执行文件(例如,使用带有ELFgcc -Wall -Wextra -g yourprog.c -o yourbin,然后使用适当的参数运行./yourbin可执行文件。您应该在程序中设置GCC并花时间调试它(所以bugs以了解出现了什么问题,然后在yourprog.c中改进代码并重复)。

BTW,shell主要处理字符串(可能是它们的数组),但是大多数C函数消耗和/或返回非字符串的数据,但更复杂的数据(例如:use the gdb debugger返回{ {1}}句柄,fopen(3)readdir(3)不操纵字符串等等...)。因此存在“阻抗不匹配”,您需要拥有或编写代码来解决这个问题。

您可能有兴趣使用某些fgetpwent(3),例如scripting languageGuile

顺便说一句,请注意今天在Linux上的实践Python(因此您不太可能想要致电FILE*)。