簡體   English   中英

如何從Shell執行庫調用命令?

[英]How to execute library calls commands from shell?

對不起,如果我問這個問題看起來很愚蠢,但我很想知道。

我只想簡單地計算一個字符串的長度(即哈希值)。 因此,我打開終端並執行以下操作:

$ 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

好吧,我知道如何使用wc -mexpr length和其他解決方法在shell中查找字符串的 expr length

是否可以編寫可以在內部調用這些庫命令並完成任務的bash腳本?

通常,您無法從Bash shell 執行任何庫函數 -當然不包括shell調用的許多庫函數(例如,其cd內置將調用chdir(2)系統調用)。

您應該使用某些程序 (通常是C編譯器生成的可執行文件 ,或其他諸如Go,Ocaml,C ++,Rust等編譯語言)來調用這些函數。 一旦有了程序,您的外殼程序將使用fork(2),然后使用execve(2)運行它。

一些外殼程序(例如zsh )也接受插件 您可以編寫(使用C,然后對其進行編譯)擴展名,為其創建一個插件並加載該插件。

實際上,要從外殼程序運行wcslen(3)函數,應編寫一些調用該源代碼的C源代碼(例如yourprog.c ),將該源代碼編譯為ELF可執行文件(例如,使用gcc -Wall -Wextra -g yourprog.c -o yourbinGCC ),然后使用適當的參數運行該./yourbin可執行文件。 您應該期望在程序中產生錯誤並花費時間進行調試(因此,請使用gdb調試器了解問題所在,然后在yourprog.c改進代碼並重復)。

順便說一句,shell主要處理字符串(可能還有它們的數組),但是大多數C函數使用和/或返回的數據不是字符串,而是更復雜的東西(例如: fopen(3)返回FILE*句柄, readdir) (3)fgetpwent(3)不要操縱字符串,等等……)。 因此,存在“阻抗不匹配”,您需要擁有或編寫代碼來解決。

您可能對使用某些腳本語言(例如GuilePython)感興趣。

順便說一句,請注意,實際上在Linux上,如今所有地方都使用UTF-8 (因此不太可能要調用wcslen )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM