Anda mungkin tidak seharusnya melakukan ini, tetapi Anda bisa. Jawaban Kusalananda lebih baik untuk tugas yang ada dan menjelaskan masalahnya. Karena Anda memang bertanya secara spesifik bagaimana cara menggunakannya panggilan perpustakaan apa pun di dalam terminal, inilah beberapa cara ...
The kecil C Compiler ( tcc
) mendukung -run
bendera yang memungkinkan Anda (berlaku) menafsirkan kode C dengan menulis program kecil, sehingga Anda dapat menggunakan panggilan perpustakaan di dalam terminal melalui doa tunggal itu.
Anda dapat menjalankan strnlen
fungsi seperti ini:
$ 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
Ini menggunakan proses substitusi dari Bash, zsh, dan shell lainnya untuk memberikan tcc
file untuk dibaca yang tampaknya berisi hasil dari semua echo
s; ada opsi lain.
Anda dapat membuat fungsi untuk menghasilkan ini untuk Anda:
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
(Saya telah menggunakan di strlen
sini sehingga itu adalah fungsi unary string-> int - Anda akan memerlukan fungsi terpisah untuk setiap jenis arity dan return yang berbeda).
Pilihan lain adalah dengan ctypes.sh
Bash Plugin oleh Tavis Ormandy, yang membungkus dlopen
dan dlsym
. Ini mungkin perkiraan terdekat dengan apa yang Anda coba. Anda dapat menggunakan, misalnya:
$ dlcall -r uint64 strlen "hello world"
dan itu akan memanggil fungsi seperti yang diharapkan.
Ini adalah cara paling langsung untuk melakukannya "dari terminal", tetapi itu tidak mungkin menjadi sesuatu paket distribusi Anda sehingga Anda harus menginstalnya secara manual (yang tidak trivial). Berikut adalah beberapa kutipanctypes.sh
informatif dari situs web sendiri untuk memberikan kesan umum tentang bagaimana perasaan orang tentang melakukan ini:
- "Itu menjijikkan"
- "ini harus dihentikan"
- "Kamu sudah terlalu jauh dengan ini"
Mungkin ada alat serupa untuk kerang lain, tapi saya tidak tahu tentang mereka. Secara teori tidak ada alasan tidak mungkin ada perintah mandiri yang melakukan ini tepat untuk kasus-kasus sederhana, tetapi saya agak terkejut saya belum dapat menemukan satu ...
... jadi saya membuat satu! dlcall
memungkinkan Anda memanggil fungsi perpustakaan dari baris perintah :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
Ini mendukung serangkaian fungsi prototipe terbatas, itu tidak terlalu dapat diandalkan atau tangguh saat ini, tetapi sekarang ada.
Anda juga bisa menggunakan, misalnya, Python danpython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
, tetapi tentu saja itu bukan cara termudah untuk melakukannya. Perl, Ruby, dan bahasa lain memiliki fitur serupa yang dapat Anda gunakan.
Jadi jawaban atas pertanyaan Anda adalah:
- Gunakan salah satu pendekatan di atas.
- Anda tidak perlu menggunakan perintah lain untuk bootstrap Anda ke perpustakaan, atau software yang kait ke shell Anda.
Secara keseluruhan, Anda hampir pasti lebih baik melakukan ini dengan cara lain.