$ PATH에서 모든 바이너리를 나열하십시오.


29

bash에서 $ 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, {...) 및 별칭 도 포함되어 있습니다.
Stéphane Chazelas

선생님, 업데이트했습니다. 오래 전에이 사이트에서 발견 한 초안을 저장했습니다.
Rahul Patil

@ jcubic, 쉘은 이미 명령 완료를 위해 그것을 수행합니다. 왜 손으로합니까?
vonbrand

@vonbrand Javascript / php에서 쉘을 작업 중이며 비 대화식 모드에서 쉘을 실행 중입니다.
jcubic

14

zsh로 :

whence -pm '*'

또는:

print -rl -- $commands

(의 둘 이상의 구성 요소에 나타나는 명령의 $PATH경우 첫 번째 명령 만 나열합니다).

전체 경로가없는 명령을 원하고 적절한 측정을 위해 정렬 한 경우 :

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

즉, 값 대신 해당 연관 배열의 키를 가져옵니다.


나는 bash를 사용하고 있다고 언급하지 않았다.
jcubic

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( .대신 사용)으로 시작하는 구성 요소 나 PATH 구성 요소 또는 실행 파일 이름에 -와일드 카드 문자 \[?*가없고으로 시작하는 실행 파일이없는 경우 다음과 같이 .단순화 할 수 있습니다.

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

POSIX findsed:

{ 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 ..

bashzsh 에는 더 간단한 솔루션이 있습니다 .


그것은 $PATH설정되어 있고 빈 구성 요소가 포함되어 있지 않으며 구성 요소가 find 술어 (또는 ls 옵션)처럼 보이지 않는다고 가정합니다 . 이들 중 일부는 도트 파일도 무시합니다.
Stéphane Chazelas

@StephaneChazelas 그래, 알았어. 빈 구성 요소를 제외하고, 이것은“하지 마십시오”범주에 해당합니다. PATH는 사용자가 제어합니다.
Gilles 'SO- 악의를 멈춰라'

빈 요소가 마지막 경우 (보통 그대로) 작동하지 않습니다. ( sh 에뮬레이션 안 yash및 제외 zsh).
Stéphane Chazelas

당신의 find것에서. -prune디렉토리를 나열하지 못하게합니다. 심볼릭 링크를 포함 하려는 -L대신 -H실행 파일에 공통적으로 사용하는 것이 좋습니다. -perm -100파일을 사용자가 실행할 수 있음을 보증하지 않으며 실행 파일을 제외시킬 수도 있습니다.
Stéphane Chazelas

4

나는 이것을 생각해 냈다.

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

편집 : 이것은 아파치 사용자가 bin 디렉토리의 일부 파일을 읽는 동안 SELinux 경고를 트리거하지 않는 유일한 명령 인 것 같습니다.


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

@manatwork 기존 경로가 아닌 경로에서 작동합니까?
jcubic

@manatwork는 당신이 그렇게 할 수 있다는 것을 몰랐습니다. IFS에 대해 더 읽어야합니다.
jcubic

3
$PATH설정되어 있고 와일드 카드 문자를 포함하지 않으며 빈 구성 요소를 포함하지 않는 것으로 가정합니다 . 또한의 GNU 구현을 가정합니다 find.
Stéphane Chazelas

2
때문에의 -type f대신 (GNU의 특정) -xtype f, 그 것 또한 생략 심볼릭 링크. 또한 $PATH심볼릭 링크 인 구성 요소 의 내용이 나열되지 않습니다 .
Stéphane Chazelas

3

이건 어때요

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

문자열 대체는 Bash와 함께 사용됩니다.


3
$PATH, 설정되어 있고 와일드 카드 나 공백 문자가없고 빈 구성 요소가 없다고 가정합니다. 그것은 GNU 찾기도 가정합니다. 참고 ${var//x/y}ksh구문 (또한 zsh을 배시 지원). 엄밀히 말하면 $ PATH 구성 요소도 find술어 가 아니라고 가정 합니다.
Stéphane Chazelas

1
또한 $PATH컴포넌트가 심볼릭 링크가 아니라고 가정합니다 .
Stéphane Chazelas

@StephaneChazelas : 감사합니다! 다시 말해, 일반적인 경우입니다.

IFS=:이 대체를 수행하는 것보다 설정 이 더 강력합니다. 공백이있는 경로는 Windows에서 일반적이지 않습니다. 심볼릭 링크는 상당히 일반적이지만이 방법으로 쉽게 해결할 수 있습니다 -H.
Gilles 'SO- 악마 그만해'

@Gilles : 물론입니다. 그러나 나는이 질문에 대한 합리적인 사용 사례를 보지 못하므로 방탄 답변이 필요하지 않습니다.

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

이것은 '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)) ])

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.