$ PATH से सभी बायनेरिज़ को सूचीबद्ध करें


30

क्या कोई एक-लाइनर है जो $ पीएटीएच से सभी निष्पादकों को बैश में सूचीबद्ध करेगा।

जवाबों:


38

यह एक उत्तर नहीं है, लेकिन यह बाइनरी दिखा रहा है, एक कमांड जिसे आप चला सकते हैं

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.

1
इस कमांड को जानने के लिए अच्छा है, और मुझे वास्तव में पूरा करने के लिए निष्पादन योग्य की आवश्यकता है। शायद मैं इस आदेश का उपयोग इसके बजाय करता हूं।
ज्यूकिक

ध्यान दें कि इसमें बिलियन, फ़ंक्शंस, कीवर्ड्स (जैसे in, {...) और उपनाम शामिल हैं।
स्टीफन चेज़लस

महोदय, मैंने अपडेट किया है .. मैं अपने ड्राफ्ट में बच गया था, बहुत समय पहले मुझे इस साइट पर मिला था ..
राहुल पाटिल

@ जुबिक, शेल पहले से ही कमांड पूरा करने के लिए करते हैं। यह हाथ से क्यों करते हैं?
वॉनब्रांड

@vonbrand मैं जावास्क्रिप्ट / php में शेल पर काम कर रहा हूं और मैं गैर संवादात्मक मोड में शेल निष्पादित कर रहा हूं।
jcubic

15

Zsh के साथ:

whence -pm '*'

या:

print -rl -- $commands

(ध्यान दें कि कमांड के लिए जो एक से अधिक घटकों में दिखाई देते हैं $PATH, वे केवल पहले एक को सूचीबद्ध करेंगे)।

यदि आप पूर्ण पथ के बिना आदेश चाहते हैं, और अच्छे उपाय के लिए हल किया गया है:

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

(यह है, मूल्यों के बजाय उस साहचर्य सरणी की कुंजी प्राप्त करें)।


मैंने उल्लेख नहीं किया कि मैं बैश का उपयोग कर रहा हूं।
ज्यूबिक

5

किसी भी 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 विकल्प) खोजें। उनमें से कुछ भी डॉट फाइलों को नजरअंदाज करेंगे।
स्टीफन चेज़लस

@StephaneChazelas हाँ, ठीक है। खाली घटकों के अलावा, यह "यह मत करो" श्रेणी के अंतर्गत आता है - पथ आपके नियंत्रण में है।
गाइल्स का SO- बुराई होना बंद हो '

यह अभी भी काम नहीं करता है यदि खाली तत्व अंतिम है (जैसा कि आमतौर पर होता है)। (सिवाय शुकुन में yashऔर zsh)।
स्टीफन चेजालस

अपने में find-pruneनिर्देशिकाओं को रोकने में मदद करेगा। आप शायद -Lइसके बजाय चाहते हैं -Hकि आप सिमिलिंक (निष्पादन योग्य के लिए सामान्य) को शामिल करना चाहते हैं। -perm -100इस बात की कोई गारंटी नहीं देता है कि फ़ाइल आपके द्वारा निष्पादित की जा सकती है (और निष्पादन योग्य फ़ाइलों को बाहर कर सकती है)।
स्टीफन चेज़लस

4

मैं इसके साथ आया:

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

संपादित करें : ऐसा लगता है कि यह एकमात्र आदेश है जो Apache उपयोगकर्ता द्वारा बिन निर्देशिका में कुछ फ़ाइलों को पढ़ते समय SELinux अलर्ट को ट्रिगर नहीं करता है।


5
क्यों for? IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
मैनेटवर्क

@manatwork यह गैर मौजूदा रास्तों के लिए काम करेगा?
जकुबिक

@manatwork नहीं जानता था कि आप ऐसा कर सकते हैं। IFS के बारे में और अधिक पढ़ने की आवश्यकता है।
jcubic

3
यह $PATHमाना जाता है कि वाइल्डकार्ड वर्ण शामिल नहीं हैं और इसमें खाली घटक नहीं हैं। यह भी GNU के कार्यान्वयन को मानता है find
स्टीफन चेजलस

2
-type f(GNU विशिष्ट) के बजाय -xtype f, यह भी सहानुभूति को छोड़ देगा। यह उन $PATHघटकों की सामग्री को भी सूचीबद्ध नहीं करेगा जो कि सीमलिंक हैं।
स्टीफन चेज़लस

3

इस बारे में कैसा है

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

बैश के साथ स्ट्रिंग प्रतिस्थापन का उपयोग किया जाता है।


3
यह $PATHमाना जाता है कि सेट किया गया है, जिसमें वाइल्डकार्ड या रिक्त वर्ण नहीं हैं, खाली घटक शामिल नहीं हैं। यह मानता है कि जीएनयू भी ऐसा ही करता है। ध्यान दें कि ${var//x/y}है kshवाक्य रचना (भी zsh और पार्टी द्वारा समर्थित)। कड़ाई से बोलना भी मानता है कि $ PATH घटक findया तो विधेय नहीं हैं।
स्टीफन चेजालस 10

1
यह भी मानता है कि $PATHघटक सहानुभूति नहीं हैं।
स्टीफन चेज़लस

@ स्टेफ़ेनचेज़लस: धन्यवाद! दूसरे शब्दों में, सामान्य मामला।

सेटिंग IFS=:इस प्रतिस्थापन को करने से अधिक मजबूत है। रिक्त स्थान वाले पथ विंडोज पर असामान्य नहीं हैं। प्रतीकात्मक लिंक काफी सामान्य हैं, लेकिन यह आसानी से हल हो गया है -H
गिल्स 'SO- बुराई होना बंद करो'

@ गिल्स: बिल्कुल। हालाँकि मुझे इस प्रश्न के लिए कोई उचित उपयोग-मामला नहीं दिखता है, इसलिए बुलेट-प्रूफ उत्तर की कोई आवश्यकता नहीं है।

1

यदि आप अपने खोल में अजगर चला सकते हैं, तो निम्न (हास्यास्पद रूप से लंबे) एक-लाइनर का उपयोग किया जा सकता है:

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)) ])

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.