Saya hanya ingin menghitung panjang string (yaitu nilai hash). Jadi, saya membuka terminal dan melakukan ini:
$ apropos length
yang mengembalikan saya dengan banyak perintah / fungsi yang telah (3)
atau (3ssl)
ditambahkan pada akhir dari mereka. Sekarang manusia memberi kita informasi tentang apa section numbers
artinya ini .
3 Library calls (functions within program libraries)
Karena penasaran, saya hanya mencoba dengan semua perintah ini (dengan harapan setidaknya satu akan bekerja)
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
dan mendapat apa-apa selain kesalahan yang sama untuk setiap perintah
$ strnlen HelloWorld
$ strnlen: command not found
Yah, saya tahu cara menemukan panjang string di shell menggunakan wc -m
, expr length
dan solusi lainnya.
Tapi, saya punya 2 pertanyaan di sini:
- Cara menggunakan salah
library calls (3)
dalam shell? - Bagaimana cara menghitung panjang string hanya dengan menggunakan panggilan perpustakaan dan bukan perintah lain?
CATATAN: Pertanyaan berfokus secara umum library calls
dan penggunaannya dalam shell. Itu membuat pertanyaan pertama lebih penting untuk dijawab.
Jawaban:
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:Ini menggunakan proses substitusi dari Bash, zsh, dan shell lainnya untuk memberikan
tcc
file untuk dibaca yang tampaknya berisi hasil dari semuaecho
s; ada opsi lain.Anda dapat membuat fungsi untuk menghasilkan ini untuk Anda:
(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 membungkusdlopen
dandlsym
. Ini mungkin perkiraan terdekat dengan apa yang Anda coba. Anda dapat menggunakan, misalnya: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 kutipan
ctypes.sh
informatif dari situs web sendiri untuk memberikan kesan umum tentang bagaimana perasaan orang tentang melakukan 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 :Ini mendukung serangkaian fungsi prototipe terbatas, itu tidak terlalu dapat diandalkan atau tangguh saat ini, tetapi sekarang ada.
Anda juga bisa menggunakan, misalnya, Python dan
python -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:
Secara keseluruhan, Anda hampir pasti lebih baik melakukan ini dengan cara lain.
sumber
Itu
apropos
Perintah ini berguna dalam banyak cara, tetapi tidak memberikan banyak "sampah" juga. Sebagian besar hal yang Anda daftarkan adalah rutinitas pustaka C (ini adalah bagian apa dari manual ini), yang tidak dapat Anda gunakan langsung dari shell.Untuk menggunakannya, Anda harus menulis program C yang memanggil mereka. Ini berada di luar kisaran topik yang dicakup oleh situs khusus ini (itu akan menjadi topik di StackOverflow ).
Jadi, inilah jawaban untuk pertanyaan Anda:
Saya tahu Anda tahu ini, tetapi demi kelengkapan: Di shell, jika Anda memiliki string dalam variabel
string
, Anda dapat melakukanIni akan mencetak
Length of string "hello world" is 11
di terminal tempat11
asalnya${#string}
yang memanjang hingga panjang string$string
.Secara internal, shell mungkin menggunakan salah satu panggilan perpustakaan yang Anda daftarkan untuk melakukan perhitungan panjangnya.
Ini adalah cara paling efisien untuk mendapatkan panjang string yang disimpan dalam variabel shell, di shell.
Perhatikan juga bahwa itu
${#string}
adalah perluasan parameter shell POSIX , oleh karena itu portabel di antara semua shell yang mengklaim tingkat kepatuhan POSIX.sumber
printf
sini. Jika Anda ingin mencetaknya sebagai bagian dari kalimat maka itu mungkin cara terbaik. Tetapi jawaban atas pertanyaan "bagaimana saya mendapatkan panjang tali?" adalah${#string}
bagian, bukan printf. Anda bisa hanyaecho ${#string}
jika Anda hanya ingin output panjangnya saja, atau menugaskannya ke variabel lain denganstring_length=${#string}
atau apa pun yang Anda inginkan. printf tidak benar-benar relevanprintf
saya menambahkan sesuatu selain hanya mengatakan "gunakan${#string}
" (yang jelas dari contoh).Saya tidak akan melakukan ini hanya
strlen()
, tetapi ini adalah trik yang berguna untuk mencoba kode C kadang-kadangIni
gdb
adalah debugger GNU, dan biasanya diperlukan nama program untuk debug setelahnya. Karena kita tidak memilikinya, contoh ini memberikannya sendiri untuk debug. Kemudianstart
mulai program, dan setelah itugdb
dapat digunakan untuk mengeksekusi kode C sewenang-wenang.sumber
Alat yang dapat digunakan untuk memanggil fungsi secara interaktif di pustaka bersama: "Koleksi Penyihir Witchcraft". https://github.com/endrazine/wcc
Dari halaman GitHub:
sumber