Muhtemelen bunu yapmamalısın , ama yapabilirsin. Kusalananda'nın cevabı eldeki görev için daha iyidir ve konuyu açıklar. Terminalde herhangi bir kütüphane çağrısını nasıl kullanacağınızı özellikle sorduğunuzdan , işte size birkaç yol ...
Minik C derleyicisi ( tcc
) Bir destekler -run
bayrak Bunu, (yürürlükte) sizi sağlayan küçük bir program yazarak C kodu yorumlamak olabilir yani tek bir çağırma yoluyla terminali içindeki herhangi kütüphane çağrıları kullanın.
strnlen
İşlevi şu şekilde çalıştırabilirsiniz :
$ 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
Bu , Bash'in, zsh'nin ve diğer mermilerin işlem ikamesinitcc
, bütün echo
s'nin sonuçlarını içerdiği okunacak bir dosya vermek için kullanır ; başka seçenekler var.
Bunu sizin için oluşturmak için bir işlev yapabilirsiniz:
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
(Ben strlen
burada tek bir işlev işlevi olan dizgiyi kullandım -> int - her bir aritelik ve dönüş tipi için ayrı bir işleve ihtiyacınız olacaktı).
Başka bir seçenek ise ,ctypes.sh
sararmış olan Tavis Ormandy'nin Bash eklentisidlopen
ve dlsym
. Bu muhtemelen denediğin şeye en yakın yaklaşım. Örneğin kullanabilirsiniz:
$ dlcall -r uint64 strlen "hello world"
ve beklendiği gibi işlevi çağıracak.
Bu, onu "terminalden" yapmanın en doğrudan yoludur, ancak dağıtım paketlerinizin olması muhtemel değildir, bu nedenle el ile yüklemeniz gerekir (ki bu önemsiz). İşte insanların bunu nasıl yaptıkları hakkında genel bir fikir vermek için kendi web sitesinden bazı bilgilendirici alıntılarctypes.sh
:
- "Bu iğrenç"
- "Bu durmalı"
- "Bununla çok ileri gittin"
Diğer mermiler için benzer araçlar olabilir, ama ben onları bilmiyorum. Teoride, basit vakalar için tam olarak bunu yapan bağımsız bir komutun olmamasının bir nedeni yoktur, ancak bir tanesini bulamadığım için biraz şaşırdım ...
... ben de bir tane yaptım! dlcall
kütüphane işlevlerini komut satırından çağırmanıza izin verir :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Sınırlı sayıda fonksiyon prototipini destekliyor, şu anda korkunç derecede güvenilir veya esnek değil, ancak şimdi var.
Örneğin Python'upython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
da kullanabilirsiniz, ancak bu kesinlikle en kolay yol değil. Perl, Ruby ve diğer dillerin kullanabileceğiniz benzer özellikleri var.
Yani sorularınızın cevapları:
- Yukarıdaki yaklaşımlardan birini kullanın.
- Sen do kütüphaneye sizi bootstrap başka bir emir kullanmak gerekir, ya da yazılım parçasıdır kabuğundan içine kanca söyledi.
Sonuçta, kesinlikle başka bir şekilde bunu yapmaktan daha iyi olacaksın.