Yanıtlar:
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.
in
, {
...) ve diğer adları da içerdiğini unutmayın .
Zsh ile:
whence -pm '*'
Veya:
print -rl -- $commands
(birden fazla bileşenin içinde görünen komutlar için $PATH
yalnı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).
Herhangi bir POSIX kabuğunda, herhangi bir harici komut kullanmadan (geri dönmediği printf
takdirde 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 find
ve 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 -A
bayrağı, ls
sizinkinde varsa ya da POSIX'e sadık kalmak istiyorsanız ekleyin :ls -aH $PATH | grep -Fxv -e . -e ..
$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.
yash
ve dışında zsh
).
find
biri. -prune
dizinlerin listelenmesini önleyecektir. Büyük olasılıkla , sembolik bağlantılar eklemek istediğiniz -L
yerine -H
(çalıştırılabilirler için ortaktır). -perm -100
Dosyanın sizin tarafınızdan çalıştırılabileceğine dair hiçbir garanti vermez (ve yürütülebilir dosyaları hariç tutabilir).
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.
for
? IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
$PATH
, belirlenmiş ve joker karakter içermediğini ve boş bileşenler içermediğini varsayar . Bu da GNU’nun uygulanmasını varsayar find
.
-type f
yerine (GNU özgü) -xtype f
, o istek de omit sembolik bağ. Bu, aynı zamanda $PATH
sembolik bağların bileşenlerini de listelemez .
Buna ne dersin
find ${PATH//:/ } -maxdepth 1 -executable
Dize değişimi Bash ile birlikte kullanılır.
$PATH
Ayarlanan, 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 ksh
sö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
.
$PATH
bileşenlerin sembolik bağlantılar olmadığını varsayar .
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
.
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)) ])
#!/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