[英]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 -m
, expr 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 yourbin
和GCC ),然后使用適當的參數運行該./yourbin
可執行文件。 您應該期望在程序中產生錯誤並花費時間進行調試(因此,請使用gdb
調試器了解問題所在,然后在yourprog.c
改進代碼並重復)。
順便說一句,shell主要處理字符串(可能還有它們的數組),但是大多數C函數使用和/或返回的數據不是字符串,而是更復雜的東西(例如: fopen(3)返回FILE*
句柄, readdir) (3)和fgetpwent(3)不要操縱字符串,等等……)。 因此,存在“阻抗不匹配”,您需要擁有或編寫代碼來解決。
您可能對使用某些腳本語言(例如Guile或Python)感興趣。
順便說一句,請注意,實際上在Linux上,如今所有地方都使用UTF-8 (因此不太可能要調用wcslen
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.