जवाबों:
यह एक उत्तर नहीं है, लेकिन यह बाइनरी दिखा रहा है, एक कमांड जिसे आप चला सकते हैं
compgen -c
(मानकर bash
)
अन्य उपयोगी आदेश
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
, {
...) और उपनाम शामिल हैं।
Zsh के साथ:
whence -pm '*'
या:
print -rl -- $commands
(ध्यान दें कि कमांड के लिए जो एक से अधिक घटकों में दिखाई देते हैं $PATH
, वे केवल पहले एक को सूचीबद्ध करेंगे)।
यदि आप पूर्ण पथ के बिना आदेश चाहते हैं, और अच्छे उपाय के लिए हल किया गया है:
print -rl -- ${(ko)commands}
(यह है, मूल्यों के बजाय उस साहचर्य सरणी की कुंजी प्राप्त करें)।
किसी भी POSIX शेल printf
में, echo
अंतिम छँटाई को छोड़कर , किसी भी बाहरी कमांड का उपयोग किए बिना (मान लिया गया है, अगर वापस नहीं गिरता है ) और कोई निष्पादन योग्य नाम नहीं है।
{ 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
यदि आपके पास कोई खाली घटक नहीं है $PATH
( .
इसके बजाय उपयोग करें ) और न ही घटकों की शुरुआत -
, और न ही वाइल्डकार्ड वर्णों \[?*
में या तो पथ घटकों या निष्पादन योग्य नाम, और कोई निष्पादन योग्य नाम नहीं है .
, तो आप इसे सरल कर सकते हैं:
{ IFS=:; for d in $PATH; do for f in $d/*; do [ -f $f ] && [ -x $f ] && echo ${x##*/}; done; done; } | sort
POSIX find
और का उपयोग करना sed
:
{ IFS=:; set -f; find -H $PATH -prune -type f -perm -100 -print; } | sed 's!.*/!!' | sort
यदि आप मार्ग में दुर्लभ गैर-निष्पादन योग्य फ़ाइल या गैर-नियमित फ़ाइल को सूचीबद्ध करने के इच्छुक हैं, तो बहुत सरल तरीका है:
{ IFS=:; ls -H $PATH; } | sort
यह स्काईप डॉट फाइलें; यदि आपको उनकी आवश्यकता है, तो -A
ध्वज को ls
यदि आपके पास है, या यदि आप POSIX से चिपके रहना चाहते हैं, तो इसमें जोड़ें :ls -aH $PATH | grep -Fxv -e . -e ..
$PATH
सेट किया गया है और इसमें खाली घटक नहीं हैं, और यह घटक ऐसे नहीं लगते जैसे कि विधेय (या ls विकल्प) खोजें। उनमें से कुछ भी डॉट फाइलों को नजरअंदाज करेंगे।
yash
और zsh
)।
find
। -prune
निर्देशिकाओं को रोकने में मदद करेगा। आप शायद -L
इसके बजाय चाहते हैं -H
कि आप सिमिलिंक (निष्पादन योग्य के लिए सामान्य) को शामिल करना चाहते हैं। -perm -100
इस बात की कोई गारंटी नहीं देता है कि फ़ाइल आपके द्वारा निष्पादित की जा सकती है (और निष्पादन योग्य फ़ाइलों को बाहर कर सकती है)।
मैं इसके साथ आया:
IFS=':';for i in $PATH; do test -d "$i" && find "$i" -maxdepth 1 -executable -type f -exec basename {} \;; done
संपादित करें : ऐसा लगता है कि यह एकमात्र आदेश है जो Apache उपयोगकर्ता द्वारा बिन निर्देशिका में कुछ फ़ाइलों को पढ़ते समय SELinux अलर्ट को ट्रिगर नहीं करता है।
for
? IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
$PATH
माना जाता है कि वाइल्डकार्ड वर्ण शामिल नहीं हैं और इसमें खाली घटक नहीं हैं। यह भी GNU के कार्यान्वयन को मानता है find
।
-type f
(GNU विशिष्ट) के बजाय -xtype f
, यह भी सहानुभूति को छोड़ देगा। यह उन $PATH
घटकों की सामग्री को भी सूचीबद्ध नहीं करेगा जो कि सीमलिंक हैं।
इस बारे में कैसा है
find ${PATH//:/ } -maxdepth 1 -executable
बैश के साथ स्ट्रिंग प्रतिस्थापन का उपयोग किया जाता है।
$PATH
माना जाता है कि सेट किया गया है, जिसमें वाइल्डकार्ड या रिक्त वर्ण नहीं हैं, खाली घटक शामिल नहीं हैं। यह मानता है कि जीएनयू भी ऐसा ही करता है। ध्यान दें कि ${var//x/y}
है ksh
वाक्य रचना (भी zsh और पार्टी द्वारा समर्थित)। कड़ाई से बोलना भी मानता है कि $ PATH घटक find
या तो विधेय नहीं हैं।
$PATH
घटक सहानुभूति नहीं हैं।
IFS=:
इस प्रतिस्थापन को करने से अधिक मजबूत है। रिक्त स्थान वाले पथ विंडोज पर असामान्य नहीं हैं। प्रतीकात्मक लिंक काफी सामान्य हैं, लेकिन यह आसानी से हल हो गया है -H
।
यदि आप अपने खोल में अजगर चला सकते हैं, तो निम्न (हास्यास्पद रूप से लंबे) एक-लाइनर का उपयोग किया जा सकता है:
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)) ])'
यह ज्यादातर खुद के लिए एक मजेदार अभ्यास था कि यह देखने के लिए कि क्या 'निष्पादन' समारोह का उपयोग किए बिना अजगर कोड की एक पंक्ति का उपयोग किया जा सकता है। अधिक पठनीय रूप में, और कुछ टिप्पणियों के साथ, कोड इस तरह दिखता है:
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