Bin PATH থেকে সমস্ত বাইনারি তালিকাভুক্ত করুন


30

এমন এক-লাইনার রয়েছে যা $ PATH থেকে ব্যাশটিতে সমস্ত এক্সিকিউটেবলের তালিকাভুক্ত করবে।

উত্তর:


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
এই কমান্ডটি জানা ভাল, এবং সম্পূর্ণরূপে আমার আসলে এক্সিকিউটেবলের প্রয়োজন। পরিবর্তে আমি এই আদেশটি ব্যবহার করব।
jcubic

মনে রাখবেন এটিতে বিল্টিনস, ফাংশন, কীওয়ার্ডস (যেমন in, {...) এবং উপাধিগুলিও অন্তর্ভুক্ত রয়েছে ।
স্টাফেন চেজেলাস

স্যার, আমি আপডেট করেছি .. আমি আমার খসড়াটি সংরক্ষণ করেছি, অনেক আগে আমি এই সাইটে খুঁজে পেয়েছি ..
রাহুল পাতিল

@ জেকিউবিক, শেলগুলি কমান্ড সমাপ্তির জন্য ইতিমধ্যে এটি করছে কেন হাতে হাতে এটি করা হয়?
ভোনব্রান্ড

@ ভনব্র্যান্ড আমি জাভাস্ক্রিপ্ট / পিএইচপি তে শেল নিয়ে কাজ করছি এবং আমি অ ইন্টারেক্টিভ মোডে শেল চালাচ্ছি।
jcubic

15

Zsh সহ:

whence -pm '*'

বা:

print -rl -- $commands

(নোট করুন যে কমান্ডগুলির একাধিক উপাদানতে প্রদর্শিত $PATHহবে, তারা কেবলমাত্র প্রথমটিকে তালিকাভুক্ত করবে)।

আপনি যদি পুরো পথ ছাড়াই কমান্ডগুলি চান এবং ভাল পরিমাপের জন্য বাছাই করে থাকেন:

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

(এটি, মানগুলির পরিবর্তে সেই সংঘবদ্ধ অ্যারের কীগুলি পান)।


আমি উল্লেখ করিনি যে আমি ব্যাশ ব্যবহার করছি।
jcubic

5

চূড়ান্ত বাছাই ব্যতীত কোনও বহিরাগত কমান্ড ব্যবহার না করে (ধরে 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 ( .পরিবর্তে ব্যবহার করুন) না থাকে বা উপাদানগুলির সাথে শুরু হয় না -, বা \[?*PATH উপাদান বা এক্সিকিউটেবল নামগুলির মধ্যে কোনও ওয়াইল্ডকার্ড অক্ষর এবং কোনও এক্সিকিউটেবলের শুরু হয় না ., আপনি এটিকে সহজ করতে পারবেন:

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

পসিক্স findএবং sed:

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

আপনি যদি পথে দুর্লভ অ-এক্সিকিউটেবল ফাইল বা অ-নিয়মিত ফাইলের তালিকা তৈরি করতে ইচ্ছুক হন তবে আরও সহজ উপায় আছে:

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

এই বিন্দু ফাইল এড়িয়ে যায়; আপনার যদি তাদের প্রয়োজন -Aহয় lsতবে আপনার এটি থাকলে পতাকাটি যুক্ত করুন বা আপনি পসিক্সটিতে লেগে থাকতে চান:ls -aH $PATH | grep -Fxv -e . -e ..

ব্যাশ এবং zsh এ আরও সহজ সমাধান রয়েছে


এটি ধরে নেওয়া হয়েছে যে $PATHসেট করা আছে এবং খালি উপাদান নেই, এবং সেই উপাদানগুলি পূর্বাভাসগুলি (বা এলএস বিকল্পগুলি) সন্ধান করার মতো দেখায় না। এর মধ্যে কিছু ডট ফাইলও উপেক্ষা করবে।
স্টাফেন শেজেলাস

@ স্টাফেনচাজেলাস হ্যাঁ, ঠিক আছে। খালি উপাদানগুলি বাদে, এটি "এটি করবেন না" বিভাগের আওতাভুক্ত হয় - PATH আপনার নিয়ন্ত্রণাধীন।
গিলস 16:41-

খালি উপাদানটি সর্বশেষে থাকলে এটি এখনও কাজ করে না (যেমনটি সাধারণত হয়)। ( শি-র অনুকরণে 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

সম্পাদনা : মনে হচ্ছে এটি একমাত্র কমান্ড যা আপাচি ব্যবহারকারীর দ্বারা বিন ডিরেক্টরিটিতে কিছু ফাইল পড়ার সময় সেলইনাক্স সতর্কতা ট্রিগার করে না।


5
কেন for? IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
manatwork

@ মানাত ওয়ার্ক এটি কি অস্তিত্বহীন পথগুলির জন্য কাজ করবে?
jcubic

@ মান্যাটওয়ার্ক জানেন না যে আপনি এটি করতে পারেন। আইএফএস সম্পর্কে আরও পড়তে হবে।
jcubic

3
এটি ধরে নেওয়া হয়েছে যে $PATHসেট করা আছে এবং এতে ওয়াইল্ডকার্ডের অক্ষর নেই এবং এতে খালি উপাদান নেই। এটি GNU এর বাস্তবায়নও ধরে নেয় find
স্টাফেন চেজেলাস

2
-type f(জিএনইউ নির্দিষ্ট) এর পরিবর্তে এটি -xtype fপ্রতীকগুলিও বাদ দিতে পারে। এটি $PATHসিমলিংকযুক্ত উপাদানগুলির সামগ্রীও তালিকাভুক্ত করবে না ।
স্টাফেন চেজেলাস

3

এই সম্পর্কে কিভাবে

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

স্ট্রিং বিকল্পটি ব্যাশের সাথে ব্যবহৃত হয়।


3
এটি ধরে নেওয়া হয়েছে যে $PATHসেট করা আছে, ওয়াইল্ডকার্ড বা ফাঁকা অক্ষর নেই, খালি উপাদান নেই। এটি জিএনইউকেও সন্ধান করে। লক্ষ্য করুন ${var//x/y}হয় kshসিনট্যাক্স (এছাড়াও zsh এবং ব্যাশ সমর্থন করে)। কঠোরভাবে বলতে গেলে এটিও ধরে নেয় যে AT PATH উপাদানগুলিও findপূর্বাভাস দেয় না।
স্টাফেন শেজেলাস

1
এটি এটিও ধরে নিয়েছে যে $PATHউপাদানগুলি চিহ্নগুলি নয়।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস: ধন্যবাদ! অন্য কথায়, স্বাভাবিক ক্ষেত্রে।

IFS=:এই প্রতিস্থাপনটি করার চেয়ে সেটিং আরও মজবুত। স্পেস সহ পাথগুলি উইন্ডোজে অসাধারণ নয়। প্রতীকী লিঙ্কগুলি মোটামুটি সাধারণ, তবে এটি সহজেই সমাধান হয়ে যায় -H
গিলস

@ গিলস: অবশ্যই তবে আমি এই প্রশ্নের জন্য কোনও যুক্তিসঙ্গত ব্যবহারের ক্ষেত্রে দেখতে পাচ্ছি না, সুতরাং বুলেট-প্রমাণ উত্তরের প্রয়োজন নেই।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.