쉘에 정의 된 함수를 어떻게 나열합니까?


223

별명을 입력하여 모든 별명 목록을 표시 할 수 있습니다.

그러나 기능을 위해 내가 할 수있는 일은 grep my .bash_profile입니다.

그것은 보조 파일에 정의되거나 동적으로 정의 된 파일이 아닌 해당 파일의 파일 만 가져옵니다.

현재 정의 된 기능을 찾는 더 편리한 방법이 있습니까?



2
@AlastairIrvine 중복 지명 감사합니다; 그러나 다른 방법으로 해결했습니다. 이 질문은 폭 넓은 선택 답변뿐만 아니라 훨씬 더 많은 견해와 의견을 제시합니다. 귀하의 지명 된 사본에 대한 승인 된 답변은 명확하지 않으며 틀림없이 잘못되었습니다.
tripleee

답변:


273

declare -F

내장 명령에 대한 -f옵션 과 함께 기능 이름과 정의가 나열 될 수 있습니다 declare(배시 내장 참조). -F하는 옵션 declare 만 (선택적으로 소스 파일과 줄 번호)를 함수 이름을 나열합니다.

배쉬 참조 매뉴얼


1
GNU bash 4.3.46 (1)-릴리스 (x86_64-pc-linux-gnu)에서 -F는 이름을 나열하고 / f는 전체 기능을 나열합니다.
ceph3us

5
"선택적"소스 파일 / 라인 번호를 얻으려면 extdebug ( shopt -s extdebug)를 활성화하고 하나 이상의 함수 이름을 declare -F명령에 제공 해야합니다 . IOW declare -F는 extdebug가 활성화되어 있어도 파일 이름 / 줄 번호를 제공 하지 않습니다 . 이는 문서에서 명확하지 않으며 특히 직관적 인 IMO입니다.
Ron Burk

더 나은 솔루션을 보려면 아래 @ user495470의 답변을 참조하십시오.
starbeamrainbowlabs

82

bash 쉘을 가정 :

typeset -f

기능을 나열합니다.

typeset -F

함수 이름 만 나열합니다.


8
내 bash v4.1.17 (9)-릴리스는 말합니다 :Obsolete. See `help declare'.
kevinarpe

5
동의어임을 아는 것이 여전히 좋습니다.
bmacnaughton

62
declare -F

모든 기능의 이름을 알려줄 것입니다

type function_name

특정 기능의 소스를 제공합니다


2
또는 그냥 소스에 선언 -f (소문자)를 사용하십시오
Katastic Voyage

51

declare -F 실제로 함수 이름뿐만 아니라 선언 명령을 인쇄합니다.

$ declare -F
declare -f function1
declare -f function2

compgen -A function기능 이름 만 인쇄 하는 데 사용할 수 있습니다 .

$ compgen -A function
function1
function2

6
compgen -A function내가 찾던 것이 었습니다.

2
좋은! 필자의 경우에도 별칭을 원했다. 다음과 같이 별칭과 기능을 모두 얻을 수있다.compgen -a -A function
Matt Byrne

+1. 다음을 사용하여 개인 기능 만 출력했습니다 (Linux Debian에서).compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak

30

조판 이 더 이상 사용되지 않습니다. 다음을 사용하십시오.

declare -f

또는

declare -f function_name

또는

type function_name

4
set | grep " ()"

grep 대신 fgrep 또는 hgrep을 사용할 수도 있습니다 (hgrep는 제가 개인적으로 좋아하는 것입니다. grep이지만 'grep-ped'결과를 강조 표시합니다.

hgrep 은 여기에서 찾을 수 있습니다 : ACME Labs hgrep


1
여기에는 함수뿐만 아니라 값이`()`인 변수도 나열됩니다.
Alois Mahdal

2
@AloisMahdal 다음은 작동하는 것 set | grep " () $" | cut -d' ' -f1입니다.. 그러나 다른 답변에 비해 지나치게 복잡합니다.
wjandrea

5
grep함수 정의와 일치하는 문자열은 오 탐지를 유발할 수 있습니다. @wjandrea는 여전히 모든 정규식과 마찬가지로 여러 줄 문자열에 의해 잡힐 수 있습니다.
Matt

1

나는 아직도 배우고,하지만 같은를 원하기 때문에 이후에이 문제를 발견하고 그 답이 없음 전문가는 아니지만, 내가 쓴 (이하 "을 기반으로 다음 전형적인 바울의 선언 "답) 나는 후였다 궁극적으로 무엇을 나에게 제공합니다 : 별명 및 함수의 형식화 된 목록 :

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    declare -F | awk {'print $3'}
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    alias | awk {'print $2'} | awk -F= {'print $1'}
    echo
    echo -e "\033[0m"
}

그것은 Lri의 대답 을보기 전에 이루어 졌으므로 그로부터 외삽하여 대신에 declareand alias를 적절한 compgen명령으로 바꿉니다 .

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    compgen -A function
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    compgen -A alias
    echo
    echo -e "\033[0m"
}

내가 원하는 것에 대한 치료를 했어요. 다른 사람에게 도움이되는 경우 공유.

많은 다른 "조치"가 가능합니다 compgen -A [action]( compgen물론 다른 옵션도 있습니다 ). 나는 좋은 쓰기 업 발견 여기에 (때문에 또한 사람이 페이지에 대한 링크를 포함하는 man compgen경우에 작동하지 않습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.