Saya ingin mengetahui jenis beberapa perintah. Apakah mungkin untuk mem-pipe atau xargs
hasil pencarian dari find
ke type
perintah di Linux?
Sebagai contoh:
find . -name anacron | type
atau
find . -name anacron | xargs type
command-line
bash
find
LjinKazama
sumber
sumber
Jawaban:
type
bukan perintah normal. Itu shell buitin. Lihat:Jadi, Anda perlu untuk memohon
bash
dengan-c
untuk mencapai apa yang Anda inginkanAtau bahkan lebih sederhana (tidak perlu
xargs
):Itu akan memanggil
bash -c "type ./file"
, dengan setiap file yang ditemukan olehfind
.-I
dalamxargs
sarana, kami mendefinisikan di sini placeholder{}
untuk digunakan nanti. Penampung ini diganti dengan nama file yang ditemukan.Mengapa shell bawaan tidak bekerja dengan
xargs
:Perintah dalam hal ini adalah excutable yang sederhana, dan shell builtin bukanlah executable. Itu tidak dapat ditemukan di sistem file. Itu ada di dalam shell itu sendiri. Jadi, Anda harus memanggil shell dan memberi tahu shell yang dipanggil untuk menjalankan perintah builtin. Itulah yang terjadi
bash -c "command"
.sumber
find ... -exec bash -c 'type "$@"' _ {} +
Ada beberapa masalah di sini (beberapa sudah disorot):
type
adalah builtin. Ini bukan perintah yang diselesaikan, ini adalah fungsi di dalam bash. Lihatman bash-builtins
. Ini hanya berfungsi dalam konteks bash jadi bukan subshellxargs
atau-exec
forked.type
digunakan untuk melakukan pencarian jalurnya sendiri. Jika Anda memberikan path (sepertifind
yang biasa dilakukan), itu mungkin hanya akan mengembalikan path itu.readlink -f
mungkin lebih baik jika Anda hanya mencoba menyelesaikan symlink; dan Anda dapat menyalurkan kexargs readlink
atau-exec readlink -f {} +
sepanjang hari.Itu bukan untuk mengatakan Anda tidak dapat melakukan apa yang Anda coba. Ada dua opsi. The
type
perintah dapat menangani banyak nama sekaligus sehingga Anda hanya bisa memberikan itu semua nama sekaligus:Untuk banyak perintah, jika ada terlalu banyak argumen, Anda akan melampaui batas panjang baris perintah (lihat
getconf ARG_MAX
). Namun, itu tidak akan berlaku dalam kasus ini karenatype
dibangun ke dalam shell dan tidak menghasilkan ID proses baru (batas panjang berlaku untuk fungsi exec () yang digunakan oleh proses anak di baris perintah normal).sumber