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
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
Jawaban:
type
bukan perintah normal. Itu shell buitin. Lihat:
$ type type
type is a shell builtin
Jadi, Anda perlu untuk memohon bash
dengan -c
untuk mencapai apa yang Anda inginkan
$ find . -name anacron | xargs -I '{}' bash -c "type {}"
Atau bahkan lebih sederhana (tidak perlu xargs
):
$ find . -name anacron -exec bash -c "type {}" \;
Itu akan memanggil bash -c "type ./file"
, dengan setiap file yang ditemukan oleh find
. -I
dalam xargs
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 bawaan terkandung dalam shell itu sendiri. Ketika nama perintah builtin digunakan sebagai kata pertama dari perintah sederhana, shell mengeksekusi perintah secara langsung, tanpa memanggil program lain. [...]
xargs membaca item dari input standar, [...], dan menjalankan perintah
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"
.
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. Lihat man bash-builtins
. Ini hanya berfungsi dalam konteks bash jadi bukan subshell xargs
atau -exec
forked.type
digunakan untuk melakukan pencarian jalurnya sendiri. Jika Anda memberikan path (seperti find
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 ke xargs 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:
type $(find /usr/sbin -name anacron)
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 karena type
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).