Sie sollten das wahrscheinlich nicht tun, aber Sie können. Kusalanandas Antwort ist besser für die anstehende Aufgabe und erklärt das Problem. Da Sie genau haben fragen , wie zu verwenden , alle innerhalb des Terminals Bibliothek Anrufe, aber hier ein paar Möglichkeiten , ...
Der Tiny C Compiler ( tcc
) unterstützt eine -run
Flagge , die Sie (in der Tat) interpretieren C - Code kann durch ein kleines Programm zu schreiben, so dass Sie kann keine Bibliothek Anrufe innerhalb des Terminals durch einen einzigen Aufruf verwendet diese .
Sie können die strnlen
Funktion folgendermaßen ausführen :
$ tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", strnlen(argv[1], 1024));}') "Hello world"
11
Hierbei wird die Prozessersetzung aus Bash, zsh und anderen Shells verwendet, um tcc
eine zu lesende Datei zu erstellen, die die Ergebnisse aller echo
s zu enthalten scheint . es gibt andere Möglichkeiten.
Sie könnten eine Funktion erstellen, um dies für Sie zu generieren:
call_library_function_s_i() {
func=$1
shift
tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", '$func'(argv[1]));}') "$*"
}
$ call_library_function_s_i strlen hello world
(Ich habe strlen
hier verwendet , damit es eine unäre Funktionszeichenfolge ist-> int - Sie benötigen eine separate Funktion für jeden unterschiedlichen arity- und return-Typ.)
Eine weitere Option ist die ctypes.sh
Bash - Plugin von Tavis Ormandy, die einpackt dlopen
und dlsym
. Dies ist wahrscheinlich die beste Annäherung an das, was Sie versucht haben. Sie können zum Beispiel verwenden:
$ dlcall -r uint64 strlen "hello world"
und es wird die Funktion wie erwartet aufrufen.
Dies ist der direkteste Weg, dies "vom Terminal aus" zu tun, aber es ist unwahrscheinlich, dass Ihre Distributionspakete installiert werden, sodass Sie es manuell installieren müssen (was nicht trivial ist). Hier sind einige informative Zitate von ctypes.sh
der eigenen Website , um einen allgemeinen Eindruck davon zu vermitteln, wie sich die Leute dabei fühlen:
- "das ist wiederlich"
- "das muss aufhören"
- "du bist damit zu weit gegangen"
Es mag ähnliche Werkzeuge für andere Shells geben, aber ich weiß nichts darüber. Theoretisch gibt es keinen Grund, warum es keinen eigenständigen Befehl geben könnte, der dies genau für die einfachen Fälle ausführt, aber ich bin etwas überrascht, dass ich keinen finden konnte ...
... also habe ich eins gemacht! dlcall
Ermöglicht den Aufruf von Bibliotheksfunktionen über die Befehlszeile :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Es unterstützt eine begrenzte Anzahl von Funktionsprototypen, ist derzeit nicht besonders zuverlässig und belastbar, existiert aber jetzt.
Sie könnten zum Beispiel auch Python und verwendenpython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, aber es ist sicherlich nicht der einfachste Weg, dies zu tun. Perl, Ruby und andere Sprachen verfügen über ähnliche Funktionen, die Sie verwenden können.
Die Antworten auf Ihre Fragen lauten also:
- Verwenden Sie einen der oben genannten Ansätze.
- Sie müssen einen anderen Befehl verwenden, um in die Bibliothek zu booten, oder eine Software, die sich in Ihre Shell einfügt.
Alles in allem sind Sie mit ziemlicher Sicherheit besser dran, wenn Sie dies auf andere Weise tun.