Vous ne devriez probablement pas faire cela, mais vous le pouvez. La réponse de Kusalananda est meilleure pour la tâche à accomplir et explique le problème. Puisque vous avez demandé spécifiquement comment utiliser les appels de bibliothèque à l'intérieur du terminal, voici quelques façons ...
Le Tiny C Compiler ( tcc
) prend en charge un -run
indicateur qui vous permet (en effet) d'interpréter le code C en écrivant un petit programme, de sorte que vous pouvez utiliser tous les appels de bibliothèque à l'intérieur du terminal via une seule invocation de cela.
Vous pouvez exécuter la strnlen
fonction comme ceci:
$ 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
Cela utilise la substitution de processus à partir de Bash, zsh et d'autres shells pour donner tcc
un fichier à lire qui semble contenir les résultats de tous les echo
s; il existe d'autres options.
Vous pouvez créer une fonction pour générer ceci pour vous:
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
(Je l'ai utilisé strlen
ici pour qu'il s'agisse d'une fonction unaire string-> int - vous auriez besoin d'une fonction distincte pour chaque type d'arité et de retour différent).
Une autre option est le ctypes.sh
plugin Bash de Tavis Ormandy, qui se termine dlopen
et dlsym
. C'est probablement l'approximation la plus proche de ce que vous essayiez. Vous pouvez utiliser, par exemple:
$ dlcall -r uint64 strlen "hello world"
et il appellera la fonction comme prévu.
C'est le moyen le plus direct de le faire "à partir du terminal", mais il est peu probable que vos packages de distribution soient installés, vous devrez donc l'installer manuellement (ce qui n'est pas trivial). Voici quelques citationsctypes.sh
informatives du propre site Web de pour donner une impression générale de la façon dont les gens se sentent à ce sujet:
- "c'est dégoutant"
- "cela doit s'arrêter"
- "tu es allé trop loin avec ça"
Il peut y avoir des outils similaires pour d'autres obus, mais je ne les connais pas. En théorie, il n'y a aucune raison qu'il ne puisse pas y avoir de commande autonome qui fasse exactement cela pour les cas simples, mais je suis quelque peu surpris de ne pas avoir pu en trouver un ...
... alors j'en ai fait un! dlcall
vous permet d'appeler des fonctions de bibliothèque à partir de la ligne de commande :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Il prend en charge un ensemble limité de prototypes de fonctions, il n'est pas terriblement fiable ou résilient actuellement, mais il existe maintenant.
Vous pouvez également utiliser, par exemple, Python etpython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, mais ce n'est certainement pas la manière la plus simple de s'y prendre. Perl, Ruby et d'autres langages ont des fonctionnalités similaires que vous pourriez utiliser.
Les réponses à vos questions sont donc:
- Utilisez l'une des approches ci-dessus.
- Vous avez besoin d'utiliser une autre commande pour vous bootstrap dans la bibliothèque, ou un morceau de logiciel qui crochets dans votre coquille.
Dans l'ensemble, vous ferez certainement mieux de faire cela d'une autre manière.