Você provavelmente não deveria fazer isso, mas você pode. A resposta de Kusalananda é melhor para a tarefa e explica a questão. Desde que você perguntou especificamente como usar qualquer chamadas de biblioteca dentro do terminal, aqui estão algumas maneiras ...
O Compilador C Minúsculo ( tcc
) suporta uma -run
bandeira que permite (na verdade) interpretar código C por escrevendo um programa pequeno, para que você possa usar qualquer chamada de biblioteca dentro do terminal através de uma única invocação disso.
Você pode executar a função strnlen
assim:
$ 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
Isso usa substituição de processos de Bash, zsh e outros shells para dê tcc
um arquivo para ler que parece conter os resultados de todos os echo
s; existem outras opções.
Você poderia criar uma função para gerar isso para você:
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
(Eu usei strlen
aqui para que seja uma função unária string- > int - você precisaria de uma função separada para cada aridade e tipo de retorno diferentes).
Outra opção é o plug-in ctypes.sh
Bash de Tavis Ormandy, que agrupa dlopen
e dlsym
. Esta é provavelmente a aproximação mais próxima do que você estava tentando. Você pode usar, por exemplo:
$ dlcall -r uint64 strlen "hello world"
e ele chamará a função como esperado.
Esta é a maneira mais direta de fazê-lo "a partir do terminal", mas é improvável que seja algo que sua distribuição empacote, então você teria que instalá-lo manualmente (o que não é trivial). Aqui estão algumas citações informativas do próprio ctypes.sh
. website para dar uma impressão geral de como as pessoas se sentem ao fazer isso:
- "that's disgusting"
- "this has got to stop"
- "you've gone too far with this"
Pode haver ferramentas semelhantes para outras shells, mas eu não sei sobre elas. Em teoria, não há razão para que não haja um comando autônomo que faça isso exatamente para os casos simples, mas estou um pouco surpreso por não ter conseguido encontrar um ...
... então eu fiz um! dlcall
permite que você chame funções de biblioteca a partir da linha de comando :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Ele suporta um conjunto limitado de protótipos de função, não é muito confiável ou resiliente atualmente, mas agora existe.
Você também pode usar, por exemplo, Python e python -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, mas Certamente não é a maneira mais fácil de fazer isso. Perl, Ruby e outros idiomas têm recursos similares que você pode usar.
Então as respostas para as suas perguntas são:
- Use uma das abordagens acima.
- Você faz precisa usar outro comando para fazer o bootstrap na biblioteca, ou um pedaço de software que se conecte ao seu shell.
Em suma, você certamente estará melhor fazendo isso de outra maneira.