Je voulais simplement calculer la longueur d'une chaîne (c'est-à-dire la valeur de hachage). J'ai donc ouvert le terminal et j'ai fait ceci:
$ apropos length
qui m'a renvoyé un tas de commandes / fonctions ayant (3)
ou (3ssl)
ajoutées à la fin d'entre eux. Maintenant, l' homme, l'homme nous donne des informations sur leur section numbers
signification.
3 Library calls (functions within program libraries)
Par curiosité, j'ai juste essayé avec toutes ces commandes (en espérant qu'au moins une fonctionnerait)
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
et n'a obtenu que la même erreur pour chaque commande
$ strnlen HelloWorld
$ strnlen: command not found
Eh bien, je sais comment trouver la longueur de chaîne dans shell en utilisant wc -m
, expr length
et d'autres solutions.
Mais, j'ai 2 questions ici:
- Comment utiliser toute
library calls (3)
l' intérieur de la coquille? - Comment calculer la longueur d'une chaîne en utilisant uniquement des appels de bibliothèque et non d'autres commandes?
REMARQUE: la question se concentre en général library calls
et leur utilisation dans le shell. Cela rend la première question plus importante à répondre.
Réponses:
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: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 lesecho
s; il existe d'autres options.Vous pouvez créer une fonction pour générer ceci pour vous:
(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 terminedlopen
etdlsym
. C'est probablement l'approximation la plus proche de ce que vous essayiez. Vous pouvez utiliser, par exemple: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 citations
ctypes.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: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 :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 et
python -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:
Dans l'ensemble, vous ferez certainement mieux de faire cela d'une autre manière.
la source
La
apropos
commande est utile à bien des égards, mais elle vous donne aussi beaucoup de "déchets". La plupart des choses que vous listez sont des routines de bibliothèque C (c'est à cela que sert la section 3 du manuel), que vous ne pouvez pas utiliser directement à partir du shell.Pour les utiliser, vous devez écrire un programme C qui les appelle. Cela tombe en dehors de la gamme de sujets couverts par ce site particulier (ce serait sur le sujet à StackOverflow ).
Voici donc les réponses à vos questions:
Je sais que vous le savez, mais pour être complet: dans le shell, si vous avez une chaîne dans une variable
string
, vous pouvez faireCela s'imprimera
Length of string "hello world" is 11
dans le terminal d'où11
provient le${#string}
qui s'étend jusqu'à la longueur de la chaîne$string
.En interne, le shell peut très bien utiliser l'un des appels de bibliothèque que vous avez répertoriés pour effectuer son calcul de longueur.
C'est le moyen le plus efficace pour obtenir la longueur d'une chaîne stockée dans une variable shell, dans le shell.
Notez également qu'il
${#string}
s'agit d' une extension des paramètres du shell POSIX , il est donc portable entre tous les shells qui revendiquent un degré de conformité POSIX.la source
printf
ici. Si vous souhaitez l'imprimer dans le cadre d'une phrase, cela pourrait être le meilleur moyen. Mais la réponse à la question "comment puis-je obtenir la longueur d'une chaîne?" est la${#string}
partie, pas le printf. Vous pouvez simplementecho ${#string}
si vous voulez simplement afficher uniquement la longueur, ou l'affecter à une autre variable avecstring_length=${#string}
ou ce que vous voulez. printf n'est pas vraiment pertinentprintf
j'ajoute autre chose que de simplement dire "utiliser${#string}
" (ce qui est évident dans l'exemple).Je ne le ferais pas juste
strlen()
, mais c'est une astuce utile pour essayer le code C parfois.Voici
gdb
le débogueur GNU, et il faudrait normalement un nom de programme pour déboguer après. Parce que nous n'en avons pas, cet exemple le donne lui-même au débogage. Démarre ensuitestart
le programme etgdb
peut ensuite être utilisé pour exécuter du code C arbitraire.la source
Un outil qui peut être utilisé pour appeler de manière interactive des fonctions dans des bibliothèques partagées: la "Witchcraft Compiler Collection". https://github.com/endrazine/wcc
Depuis la page GitHub:
la source