Apakah ada cara "mudah" untuk menjalankan perintah gaya "ls -la" untuk membuat daftar semua file / binari yang dapat dieksekusi di PATH saat ini?
(Saya bermaksud untuk menyalurkan output ke grep, untuk mencari perintah dengan awalan yang tidak diketahui tetapi pada dasarnya dikenal "nama", jenis kasus ketika pelengkapan / tab otomatis di bash pada dasarnya tidak berguna. Jadi semacam "inversi otomatis" fitur lengkap "...)
bash
ls
path
autocomplete
sme
sumber
sumber
ls -la
?Jawaban:
sumber
which $(compgen -A function -abck)
?Berikut adalah fungsi yang mencantumkan konten direktori
$PATH
. Jika melewati argumen, fungsi hanya mencantumkan perintah yang namanya mengandung salah satu argumen. Argumen diinterpretasikan sebagai pola glob.Seperti banyak hal, ini lebih mudah di zsh.
The
^
karakter dalam ekspansi parameter menyebabkan teks bersambung dengan array yang akan ditambahkan ke setiap elemen array, misalnyapath=(/bin /usr/bin); echo $^path/foo
cetakan/bin/foo /usr/bin/foo
./*$^@*
terlihat seperti penghinaan buku komik tetapi sebenarnya karakter biasa/
, wildcard*
, parameter khusus$@
(array parameter posisi) dengan^
pengubah, dan lagi*
.(N:t)
adalah kualifikasi globN
untuk mendapatkan ekspansi kosong jika tidak ada pertandingan yang diikuti oleh pengubah sejaraht
untuk menjaga hanya nama belakang ("ekor") dari setiap pertandingan.Lebih samar, menghindari panggilan eksternal tetapi ini hanya untuk kepentingan kosmetik:
Anda mungkin sebenarnya sedang mencari
apropos
perintah, yang mencari halaman manual dari perintah yang deskripsi singkatnya berisi kata kunci. Batasannya adalah ini hanya menemukan perintah yang memiliki halaman manual.sumber
^
tampaknya tidak menghasilkan keluaran untuk panggilan "tanpa argumen"? Jika Anda menjatuhkannya, Anda bisa mendaftar semuanya, dan masih mencari kata kunci tunggal (tetapi bukan daftar kata kunci). The(Non:t)
tampaknya mengatakan bahwa tanda bintang harus diperluas? Tidak dapat menemukan yang terakhir.path
, tetapi ketika saya menjalankannya di shell, itu memang $ PATH tetapi dengan spasi bukan:
. Selebihnya jernih :)$path
adalah fitur zsh: ini adalah parameter terikat , array yang diperbarui secara otomatis saatPATH
diperbarui dan sebaliknya.find hanya cocok dengan itu: memiliki setidaknya satu set bit "x" (dapat dieksekusi), dan itu bukan direktori.
dan gunakan dengan daftar regexp untuk ditemukan:
sumber
echo $PATH | tr ':' '\n' | sort | uniq -d
pertama kita gema
$PATH
ke sed dan ganti ":" dengan "".kemudian kami mencari pada masing-masing hal untuk menemukan file dengan rwx dan menggemakannya.
2> /dev/null
begitufind
tidak akan mencetak kesalahansumber
-maxdepth 1
dan-type f
dalam pencarian Anda, kalau tidak Anda akan menemukan subdirektori dan file-file mereka (yang pencarian PATH tidak akan). Juga, tes izin Anda aneh — haruskah hanya untuk+x
, kurasa?:/bin
atau/bin::/usr/bin
. Coba tambahkans/::/:.:/;s/^:/.:/;s/:$/:./
kesed
perintah.find
dapat mencari lebih banyak jalur, sehingga Anda dapat melakukannya tanpa loop:find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …
Tentu saja, nama direktori yang mengandung spasi akan mengacaukannya, tetapi yang berbasis loop memiliki masalah yang sama.for
. Jadifor
akan mengulang daftar 4 kata. Untuk memanipulasi kata membelah lebih baik mengaturIFS
sesuai dengan kebutuhan Anda:IFS=':'; find $PATH -perm +rwx …
.