Apakah ada satu-liner yang akan mencantumkan semua executable dari $ PATH di bash.
bash
shell
path
executable
jcubic
sumber
sumber
in
,{
...) dan alias.Dengan zsh:
Atau:
(perhatikan bahwa untuk perintah yang muncul di lebih dari satu komponen
$PATH
, mereka akan mendaftar hanya yang pertama).Jika Anda ingin perintah tanpa jalur lengkap, dan diurutkan untuk mengukur:
(Yaitu, dapatkan kunci array asosiatif alih-alih nilai).
sumber
Dalam setiap shell POSIX, tanpa menggunakan perintah eksternal (dengan asumsi
printf
dibangun di dalam, jika tidak kembali keecho
) kecuali untuk pengurutan akhir, dan dengan asumsi bahwa tidak ada nama yang dapat dieksekusi berisi baris baru:Jika Anda tidak memiliki komponen kosong dalam
$PATH
(gunakan.
saja) atau komponen yang dimulai dengan-
, atau karakter wildcard\[?*
dalam komponen PATH atau nama yang dapat dieksekusi, dan tidak ada yang dapat dijalankan yang dimulai dengan.
, Anda dapat menyederhanakan ini ke:Menggunakan POSIX
find
dansed
:Jika Anda bersedia untuk mencantumkan file langka yang tidak dapat dieksekusi atau file tidak biasa di jalur, ada cara yang lebih sederhana:
Ini melompati file dot; jika Anda membutuhkannya, tambahkan
-A
bendera kels
jika Anda memilikinya, atau jika Anda ingin tetap berpegang pada POSIX:ls -aH $PATH | grep -Fxv -e . -e ..
Ada solusi yang lebih sederhana di bash dan di zsh .
sumber
$PATH
diatur dan tidak mengandung komponen kosong, dan bahwa komponen tidak terlihat seperti menemukan predikat (atau opsi ls). Beberapa dari mereka juga akan mengabaikan file dot.yash
danzsh
dalam emulasi sh).find
satu Anda .-prune
akan mencegah daftar direktori. Anda mungkin ingin-L
bukan-H
karena Anda ingin menyertakan symlink (umum untuk executable).-perm -100
tidak memberikan jaminan bahwa file dapat dieksekusi oleh Anda (dan mungkin (tidak mungkin) mengecualikan file yang dapat dieksekusi).Saya datang dengan ini:
EDIT : Tampaknya ini adalah satu-satunya perintah yang tidak memicu peringatan SELinux saat membaca beberapa file di direktori bin oleh pengguna apache.
sumber
for
?IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
$PATH
diatur dan tidak mengandung karakter wildcard dan tidak mengandung komponen kosong. Itu juga mengasumsikan implementasi GNU darifind
.-type f
alih - alih (khusus GNU)-xtype f
, itu juga akan menghilangkan symlink. Itu juga tidak akan mencantumkan konten$PATH
komponen yang merupakan symlink.Bagaimana dengan ini
Substitusi string digunakan dengan Bash.
sumber
$PATH
diatur, tidak mengandung karakter pengganti atau karakter kosong, tidak mengandung komponen kosong. Itu mengasumsikan menemukan GNU juga. Perhatikan bahwa${var//x/y}
ini adalahksh
sintaks (juga didukung oleh zsh dan bash). Tegasnya, itu juga mengasumsikan bahwa komponen $ PATH juga bukanfind
predikat.$PATH
komponen bukanlah symlink.IFS=:
lebih kuat daripada melakukan substitusi ini. Jalur dengan spasi tidak biasa di Windows. Tautan simbolik cukup umum, tetapi mudah dipecahkan-H
.Jika Anda dapat menjalankan python di shell Anda, maka satu-liner berikut (panjangnya ridiculously) dapat digunakan juga:
Ini sebagian besar merupakan latihan yang menyenangkan bagi saya untuk melihat apakah itu dapat dilakukan dengan menggunakan satu baris kode python tanpa menggunakan fungsi 'exec'. Dalam bentuk yang lebih mudah dibaca, dan dengan beberapa komentar, kode ini terlihat seperti ini:
sumber
sumber