Você provavelmente não deveria fazer isso, mas pode. A resposta de Kusalananda é melhor para a tarefa em questão e explica a questão. Como você perguntou especificamente como usar qualquer chamada de biblioteca dentro do terminal, aqui estão algumas maneiras ...
O Tiny C Compiler ( tcc
) suporta um -run
sinalizador que permite (com efeito) interpretar o código C escrevendo um pequeno programa, para que você possa usar qualquer chamada de biblioteca dentro do terminal através de uma única chamada.
Você pode executar a strnlen
função 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 a substituição de processo do Bash, zsh e outros shells para fornecer tcc
um arquivo para ler que parece conter os resultados de todos os echo
s; existem outras opções.
Você pode 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 tipo de retorno e aridade diferente).
Outra opção é o ctypes.sh
plugin Bash de Tavis Ormandy, que encerra 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 chamará a função conforme o esperado.
Essa é a maneira mais direta de fazê-lo "a partir do terminal", mas é improvável que seja algo que seus pacotes de distribuição instalem, então você teria que instalá-lo manualmente (o que não é trivial). Aqui estão algumas citaçõesctypes.sh
informativas do próprio site para dar uma impressão geral de como as pessoas se sentem ao fazer isso:
- "isso é nojento"
- "Isto tem que parar"
- "você foi longe demais com isso"
Pode haver ferramentas semelhantes para outras conchas, mas eu não as conheço. Em teoria, não há razão para que não possa haver um comando independente que faça isso exatamente nos casos simples, mas estou um pouco surpreso por não ter conseguido encontrar um ...
... então eu fiz um! dlcall
permite chamar funções de biblioteca na 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, atualmente não é muito confiável ou resistente, mas agora existe.
Você também pode usar, por exemplo, Python epython -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 semelhantes que você pode usar.
Portanto, as respostas para suas perguntas são:
- Use uma das abordagens acima.
- Você não precisa usar um outro comando para inicializar-lo para a biblioteca, ou um pedaço de software que ganchos em seu shell.
Em suma, você quase certamente estará melhor fazendo isso de qualquer outra maneira.