Memipis ke perintah "ketik"

10

Saya ingin mengetahui jenis beberapa perintah. Apakah mungkin untuk mem-pipe atau xargshasil pencarian dari findke typeperintah di Linux?

Sebagai contoh:

find . -name anacron | type

atau

find . -name anacron | xargs type
LjinKazama
sumber
Saya pikir jawaban Oli adalah jawaban terbaik. Jawaban chaos hanya berfungsi, tetapi jawaban Oli pintar.
Helio

Jawaban:

17

typebukan perintah normal. Itu shell buitin. Lihat:

$ type type
type is a shell builtin

Jadi, Anda perlu untuk memohon bashdengan -cuntuk 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. -Idalam xargssarana, 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".

kekacauan
sumber
3
Anda bisa memadatkannya kefind ... -exec bash -c 'type "$@"' _ {} +
muru
2
@uru memang, saya membaca jawaban saya sendiri lagi dan melihatnya =)
kekacauan
11

Ada beberapa masalah di sini (beberapa sudah disorot):

  • typeadalah 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 xargsatau -execforked.
  • typedigunakan untuk melakukan pencarian jalurnya sendiri. Jika Anda memberikan path (seperti findyang biasa dilakukan), itu mungkin hanya akan mengembalikan path itu. readlink -fmungkin lebih baik jika Anda hanya mencoba menyelesaikan symlink; dan Anda dapat menyalurkan ke xargs readlinkatau -exec readlink -f {} +sepanjang hari.

Itu bukan untuk mengatakan Anda tidak dapat melakukan apa yang Anda coba. Ada dua opsi. The typeperintah 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 typedibangun ke dalam shell dan tidak menghasilkan ID proses baru (batas panjang berlaku untuk fungsi exec () yang digunakan oleh proses anak di baris perintah normal).

Oli
sumber
1
Oli terima kasih! Pemula linux ini telah mempelajari sesuatu yang baru hari ini mengenai "tipe" dan perilakunya.
LjinKazama