উত্তর:
এটি কোনও উত্তর নয়, তবে এটি বাইনারি দেখাচ্ছে, একটি কমান্ড যা আপনি চালাতে পারেন
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}
(এটি, মানগুলির পরিবর্তে সেই সংঘবদ্ধ অ্যারের কীগুলি পান)।
চূড়ান্ত বাছাই ব্যতীত কোনও বহিরাগত কমান্ড ব্যবহার না করে (ধরে 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 ..
$PATH
সেট করা আছে এবং খালি উপাদান নেই, এবং সেই উপাদানগুলি পূর্বাভাসগুলি (বা এলএস বিকল্পগুলি) সন্ধান করার মতো দেখায় না। এর মধ্যে কিছু ডট ফাইলও উপেক্ষা করবে।
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
সম্পাদনা : মনে হচ্ছে এটি একমাত্র কমান্ড যা আপাচি ব্যবহারকারীর দ্বারা বিন ডিরেক্টরিটিতে কিছু ফাইল পড়ার সময় সেলইনাক্স সতর্কতা ট্রিগার করে না।
for
? IFS=:; find $PATH -maxdepth 1 -executable -type f -printf '%f\n'
$PATH
সেট করা আছে এবং এতে ওয়াইল্ডকার্ডের অক্ষর নেই এবং এতে খালি উপাদান নেই। এটি GNU এর বাস্তবায়নও ধরে নেয় find
।
-type f
(জিএনইউ নির্দিষ্ট) এর পরিবর্তে এটি -xtype f
প্রতীকগুলিও বাদ দিতে পারে। এটি $PATH
সিমলিংকযুক্ত উপাদানগুলির সামগ্রীও তালিকাভুক্ত করবে না ।
এই সম্পর্কে কিভাবে
find ${PATH//:/ } -maxdepth 1 -executable
স্ট্রিং বিকল্পটি ব্যাশের সাথে ব্যবহৃত হয়।
$PATH
সেট করা আছে, ওয়াইল্ডকার্ড বা ফাঁকা অক্ষর নেই, খালি উপাদান নেই। এটি জিএনইউকেও সন্ধান করে। লক্ষ্য করুন ${var//x/y}
হয় ksh
সিনট্যাক্স (এছাড়াও zsh এবং ব্যাশ সমর্থন করে)। কঠোরভাবে বলতে গেলে এটিও ধরে নেয় যে AT 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