$ PATH konumundaki tüm ikili dosyaları listele


30

$ PATH 'den tüm çalıştırılabilir dosyaları bash olarak listeleyen bir liner var mı?

Yanıtlar:


38

Bu bir cevap değil, ancak çalıştırabileceğiniz bir komut olarak ikili gösteriyor.

compgen -c

(varsayarak bash)

Diğer faydalı komutlar

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

1
Bu komutu bilmek güzel ve aslında tamamlama için çalıştırılabilir dosyalara ihtiyacım var. Belki bunun yerine bu komutu kullanırım.
jcubic

Ayrıca yerleşikleri, işlevleri, anahtar kelimeleri (gibi in, {...) ve diğer adları da içerdiğini unutmayın .
Stéphane Chazelas

Efendim, güncelledim ..
Rahul Patil

@jcubic, kabukları zaten komut tamamlama için yapıyor. Neden elle yapıyorsun?
vonbrand

@ vonbrand Ben javascript / php kabuk üzerinde çalışıyorum ve kabuk etkileşimli olmayan modda yürütüyorum.
jcubic

15

Zsh ile:

whence -pm '*'

Veya:

print -rl -- $commands

(birden fazla bileşenin içinde görünen komutlar için $PATHyalnızca birincisini listeleyeceklerini unutmayın).

Komutları tam yollar olmadan ve iyi bir önlem almak için sıralanmış olarak istiyorsanız:

print -rl -- ${(ko)commands}

(yani, değerler yerine bu ilişkisel dizinin anahtarlarını alın).


Ben bash kullandığımı söylemedim.
jcubic

5

Herhangi bir POSIX kabuğunda, herhangi bir harici komut kullanmadan (geri dönmediği printftakdirde yerleşik olduğu varsayılır echo), son sıralama dışında ve çalıştırılabilir bir adın bir yeni satır içermediğini varsayarak:

{ set -f; IFS=:; for d in $PATH; do set +f; [ -n "$d" ] || d=.; for f in "$d"/.[!.]* "$d"/..?* "$d"/*; do [ -f "$f" ] && [ -x "$f" ] && printf '%s\n' "${x##*/}"; done; done; } | sort

Boş bir bileşeniniz $PATH( .onun yerine kullanın) veya ondan başlayacak bileşenler veya PATH bileşenlerinde veya çalıştırılabilir adlarında -joker karakterleri \[?*yoksa başlarında çalıştırılabilir dosya .yoksa, şunu basitleştirebilirsiniz:

{ IFS=:; for d in $PATH; do for f in $d/*; do [ -f $f ] && [ -x $f ] && echo ${x##*/}; done; done; } | sort

POSIX findve kullanarak sed:

{ IFS=:; set -f; find -H $PATH -prune -type f -perm -100 -print; } | sed 's!.*/!!' | sort

Nadir çalıştırılamayan veya normal olmayan dosyaları yolda listelemeye istekli iseniz, çok daha basit bir yol var:

{ IFS=:; ls -H $PATH; } | sort

Bu nokta dosyalarını atlar; İhtiyacınız olursa -Abayrağı, lssizinkinde varsa ya da POSIX'e sadık kalmak istiyorsanız ekleyin :ls -aH $PATH | grep -Fxv -e . -e ..

Bash ve zsh'de daha basit çözümler var .


Bu $PATH, ayarlanmış ve boş bileşenler içermediğini ve bileşenlerin yüklemleri bulma (veya ls seçenekleri) gibi görünmediğini varsayar . Bunlardan bazıları nokta dosyalarını da görmezden gelir.
Stéphane Chazelas

@StephaneChazelas Evet, tamam. Boş bileşenlerden ayrı olarak, bu açıkça “bunu yapma” kategorisine girer - PATH sizin kontrolünüz altındadır.
Gilles 'SO- kötülük' dur

Boş eleman son ise hala işe yaramaz (genellikle olduğu gibi). ( sh emülasyonunda yashve dışında zsh).
Stéphane Chazelas,

Senin içinde findbiri. -prunedizinlerin listelenmesini önleyecektir. Büyük olasılıkla , sembolik bağlantılar eklemek istediğiniz -Lyerine -H(çalıştırılabilirler için ortaktır). -perm -100Dosyanın sizin tarafınızdan çalıştırılabileceğine dair hiçbir garanti vermez (ve yürütülebilir dosyaları hariç tutabilir).
Stéphane Chazelas

4

Bununla geldim:

IFS=':';for i in $PATH; do test -d "$i" && find "$i" -maxdepth 1 -executable -type f -exec basename {} \;; done

EDIT : Bu, Apache kullanıcısı tarafından bin dizinindeki dosyaların bazılarını okurken SELinux uyarısını tetiklemeyen tek komut gibi görünüyor.


5
Neden for? IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
Manat çalışması

@ manatwork mevcut olmayan yollar için çalışacak mı?
jcubic

@ manatwork bunu yapabileceğinizi bilmiyordu. IFS hakkında daha fazla şey okumalısınız.
jcubic

3
Bu $PATH, belirlenmiş ve joker karakter içermediğini ve boş bileşenler içermediğini varsayar . Bu da GNU’nun uygulanmasını varsayar find.
Stéphane Chazelas

2
Çünkü -type fyerine (GNU özgü) -xtype f, o istek de omit sembolik bağ. Bu, aynı zamanda $PATHsembolik bağların bileşenlerini de listelemez .
Stéphane Chazelas

3

Buna ne dersin

find ${PATH//:/ } -maxdepth 1 -executable

Dize değişimi Bash ile birlikte kullanılır.


3
$PATHAyarlanan, joker veya boş karakterler içermediğini, boş bileşenler içermediğini varsayar . GNU’nun da bulduğu varsayılmaktadır. Not ${var//x/y}olan kshsözdizimi (aynı zamanda zsh ve Bash ile desteklenir). Açıkçası, bu aynı zamanda $ PATH bileşenlerinin de öngörücü olmadığını varsaymaktadır find.
Stéphane Chazelas

1
Bu aynı zamanda $PATHbileşenlerin sembolik bağlantılar olmadığını varsayar .
Stéphane Chazelas,

@StephaneChazelas: Teşekkürler! Başka bir deyişle, olağan durum.

Ayar IFS=:, bu değişikliği yapmaktan daha sağlam. Boşluk içeren yollar Windows'ta nadir değildir. Sembolik bağlantılar oldukça yaygındır, ancak bu kolayca çözülebilir -H.
Gilles 'SO- kötülük' dur

@Gilles: elbette. ancak bu soru için makul bir kullanım durumu göremiyorum, bu nedenle kurşun geçirmez bir cevaba gerek yok.

1

Python'u kabuğunuzda çalıştırabilirseniz, aşağıdaki (gülünç derecede uzun) bir astar da kullanılabilir:

python -c 'import os;import sys;output = lambda(x) : sys.stdout.write(x + "\n"); paths = os.environ["PATH"].split(":") ; listdir = lambda(p) : os.listdir(p) if os.path.isdir(p) else [ ] ; isfile = lambda(x) : True if os.path.isfile(os.path.join(x[0],x[1])) else False ; isexe = lambda(x) : True if os.access(os.path.join(x[0],x[1]), os.X_OK) else False ; map(output,[ os.path.join(p,f) for p in paths for f in listdir(p) if isfile((p,f)) and isexe((p,f)) ])'

Bu, 'exec' işlevini kullanmaya başvurmadan bir satır python kodu kullanarak yapılıp yapılmadığını görmek için benim için eğlenceli bir egzersizdi. Daha okunaklı bir biçimde ve bazı yorumlar ile kod şöyle görünür:

import os
import sys

# This is just to have a function to output something on the screen.
# I'm using python 2.7 in which 'print' is not a function and cannot
# be used in the 'map' function.
output = lambda(x) : sys.stdout.write(x + "\n")

# Get a list of the components in the PATH environment variable. Will
# abort the program is PATH doesn't exist
paths = os.environ["PATH"].split(":")

# os.listdir raises an error is something is not a path so I'm creating
# a small function that only executes it if 'p' is a directory
listdir = lambda(p) : os.listdir(p) if os.path.isdir(p) else [ ]

# Checks if the path specified by x[0] and x[1] is a file
isfile = lambda(x) : True if os.path.isfile(os.path.join(x[0],x[1])) else False

# Checks if the path specified by x[0] and x[1] has the executable flag set
isexe = lambda(x) : True if os.access(os.path.join(x[0],x[1]), os.X_OK) else False

# Here, I'm using a list comprehension to build a list of all executable files
# in the PATH, and abusing the map function to write every name in the resulting
# list to the screen.
map(output, [ os.path.join(p,f) for p in paths for f in listdir(p) if isfile((p,f)) and isexe((p,f)) ])

0
#!/usr/bin/env python
import os
from os.path import expanduser, isdir, join, pathsep

def list_executables():
    paths = os.environ["PATH"].split(pathsep)
    executables = []
    for path in filter(isdir, paths):
        for file_ in os.listdir(path):
            if os.access(join(path, file_), os.X_OK):
                executables.append(file_)
    return executables
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.