Probabilmente non dovresti farlo, ma puoi. La risposta di Kusalananda è migliore per il compito da svolgere e spiega il problema. Dato che hai chiesto in modo specifico come utilizzare qualsiasi chiamata in libreria all'interno del terminale, ecco alcuni modi ...
Il minuscolo compilatore C ( tcc
) supporta un -run
flag che consente (in effetti) di interpretare il codice C scrivendo un piccolo programma, in modo da poter utilizzare qualsiasi chiamata della libreria all'interno del terminale tramite un'unica chiamata.
È possibile eseguire la strnlen
funzione in questo modo:
$ 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
Questo utilizza la sostituzione del processo da Bash, zsh e altre shell per dare tcc
un file da leggere che sembra contenere i risultati di tutti echo
i messaggi; ci sono altre opzioni.
Potresti creare una funzione per generare questo per te:
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
(Ho usato strlen
qui in modo che sia una stringa di funzione unaria-> int - avresti bisogno di una funzione separata per ogni diverso arity e tipo di ritorno).
Un'altra opzione è il ctypes.sh
plug-in Bash di Tavis Ormandy, che si chiude dlopen
e dlsym
. Questa è probabilmente l'approssimazione più vicina a ciò che stavi provando. Puoi usare, ad esempio:
$ dlcall -r uint64 strlen "hello world"
e chiamerà la funzione come previsto.
Questo è il modo più diretto per farlo "dal terminale", ma è improbabile che si tratti di un pacchetto di distribuzione, quindi dovresti installarlo manualmente (che non è banale). Ecco alcune citazionictypes.sh
informative dal proprio sito Web per dare un'idea generale di come le persone si sentono a farlo:
- "è disgustoso"
- "questo deve finire"
- "sei andato troppo lontano con questo"
Potrebbero esserci strumenti simili per altre shell, ma non ne sono a conoscenza. In teoria non c'è motivo per cui non ci potrebbe essere un comando autonomo che ha fatto esattamente questo per i casi semplici, ma sono un po 'sorpreso di non essere stato in grado di trovarne uno ...
... quindi ne ho creato uno! dlcall
consente di chiamare le funzioni di libreria dalla riga di comando :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Supporta un set limitato di prototipi di funzioni, attualmente non è estremamente affidabile o resiliente, ma ora esiste.
Potresti anche usare, ad esempio, Python epython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, ma non è certamente il modo più semplice per farlo. Perl, Ruby e altre lingue hanno caratteristiche simili che potresti usare.
Quindi le risposte alle tue domande sono:
- Utilizzare uno degli approcci sopra.
- È Non è necessario utilizzare un altro comando per il bootstrap voi in biblioteca, o un pezzo di software che ami nel tuo guscio.
Tutto sommato, sarà quasi sicuramente meglio farlo in qualsiasi altro modo.