Перечислите все двоичные файлы от $PATH

У меня было так много раздражения с окнами, я отчаялся и затем записал функции для контакта с ним раз и навсегда. При помещении их в файлы инициализации, Вы никогда не можете замечать их. Те, которые ниже, являются некоторыми из них с комментариями, таким образом, Вы поймете, что можно сделать, и как. Отметьте, хотя, это потребует большой игры; но при выполнении, избавление от мыши все смотрит способ, которым Вы хотите, и т.д. - это стоит того.

## hide all X windows
hideall () {
    DISPLAY=":0"  # (if you call this function from a tty)
    wmctrl -k on  # show desKtop: i.e., hide all windows
}

# urxvt window
# note: try `wmctrl -l` (as in "list") for windows to manipulate
alias maxu='wmctrl -r urxvt -b toggle,fullscreen' # -r: taRget window
alias hidu='wmctrl -r urxvt -b toggle,hidden'     # -b: what to do
fiftu () {
  wmctrl -r urxvt -b remove,fullscreen
  wmctrl -r urxvt -e 0,0,358,1024,381             # -e: rEsize
}

Вот более усовершенствованный пример, как сохранить и перезагрузить состояние окна, если Вам нравится скрывать его при выполнении чего-то еще:

# store what window was displayed as a numeric value
WIN=`xprop -display ":0" -root | grep ^_NET_ACTIVE_WINDOW \
                               | cut -d" " -f5`
# hide all windows
hideall

# do stuff

# restore the window, using the number you obtained above
#  -i instead of a string, identify window with a numeric value
#  -a Activate
DISPLAY=":0" wmctrl -i -a $WIN
32
22.03.2014, 16:41
7 ответов

Это не ответ, но он показывает двоичную команду, которую вы можете запустить

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.
41
27.01.2020, 19:37

Как насчет этого

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

Подстановка строк используется в Bash.

3
27.01.2020, 19:37

Если вы можете запустить python в своей оболочке, можно также использовать следующий (до смешного длинный) однострочник:

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

Это было в основном забавным поупражняюсь для себя, чтобы увидеть, можно ли это сделать, используя одну строку кода Python, не прибегая к использованию функции exec. В более удобочитаемой форме и с некоторыми комментариями код выглядит так:

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)) ])
1
27.01.2020, 19:37
#!/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
0
27.01.2020, 19:37

С zsh:

whence -pm '*'

Или:

print -rl -- $commands

(обратите внимание, что для команд, которые появляются более чем в одном компоненте $ PATH , они будут перечислять только первый).

Если вы хотите, чтобы команды не содержали полных путей и были хорошо отсортированы:

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

(то есть получить ключи этого ассоциативного массива вместо значений).

15
27.01.2020, 19:37

В любой оболочке 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 (используйте . ), ни компонентов, начинающихся с -, ни символов подстановки \[?* ни в компонентах 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 ...

Есть более простые решения в bash и в zsh.

5
27.01.2020, 19:37

Я придумал следующее:

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

EDIT : Похоже, это единственная команда, которая не запускает предупреждение SELinux при чтении некоторых файлов в каталоге bin пользователем apache.

4
27.01.2020, 19:37

Теги

Похожие вопросы