bash 함수가 정의 된 파일을 찾는 방법을 알 수 없습니다 ( __git_ps1
필자의 경우).
나는 실험 declare
, type
, which
,하지만 아무것도 나에게 소스 파일을 알려줍니다. declare
파일 이름과 줄 번호를 인쇄 할 수 있는 곳을 읽었 지만 어떻게 설명하지 않았습니다. 에 대한 help
페이지도 declare
말하지 않았습니다.
이 정보를 어떻게 얻을 수 있습니까?
bash 함수가 정의 된 파일을 찾는 방법을 알 수 없습니다 ( __git_ps1
필자의 경우).
나는 실험 declare
, type
, which
,하지만 아무것도 나에게 소스 파일을 알려줍니다. declare
파일 이름과 줄 번호를 인쇄 할 수 있는 곳을 읽었 지만 어떻게 설명하지 않았습니다. 에 대한 help
페이지도 declare
말하지 않았습니다.
이 정보를 어떻게 얻을 수 있습니까?
답변:
함수를 실행할 준비가 된 경우 실행 set -x
을 추적하고 PS4
변수를 설정 하여 정보를 얻을 수 있습니다 .
추가 디버깅 정보를 기록 --debugger
하거나 사용 shopt -s extdebug
하여 bash를 시작하십시오 .
PS4
소스 라인을 표시하기 위해 추적 할 때 인쇄되는 '프롬프트'를 설정하십시오 .
추적을 켭니다.
그런 다음 함수를 실행할 수 있으며 각 줄마다 함수의 파일 이름을 얻습니다.
set +x
추적을 끄는 데 사용 합니다.
따라서이 경우에는
bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x
기능을 실행하지 않으려는 경우에도 디버깅을 설정하고 정보를 얻을 수 있습니다. 단계는
bash --debugger
또는 시작 shopt -s extdebug
하기 전에.declare -F __git_ps1
함수가 정의 된 위치를보고합니다.
PS4로 주석이 달린 실행 추적을 보는 것과 비교할 때이 방법의 장점은 다음과 같습니다.
실행 추적의 장점은 다음과 같습니다.
나는 강하게 가지고 추천 shopt -s extdebug
모두의 시작 ~/.bashrc
과 ~/.bash_profile
다른 충당하기 위해 파일을 다른에 사용되는 호출의 경우를.
shopt -s extdebug
호출되는 경우에도 작동합니다 . 함수가를 통해 선언되면 줄 번호가 꺼져있을 수 있습니다 (현재 버그) . eval
bash --debugger
실제로 완성을 유발했다 정의 완성 기능을 얻을 그것은에서보고 얻을 수 있습니다 declare -F _vpnc
.
@icarus의 훌륭한 솔루션 은 문자 그대로 정의되고 다른 파일의 내용 결과가 아닌 함수에 대해 작동합니다 . 별칭의 소스 파일, 셸 내장 (예 :) 및 실행 파일 (이진 여부)을 인쇄하지 않으며이 정보는 일반적으로 사용할 수 없다고 생각합니다. 일부 명령은 정상적인 실행 과정이나 신호에 대한 응답으로 소스 파일을 인쇄 할 수 있습니다.eval
eval
echo
__git_ps1
에 정의 /usr/share/git/git-prompt.sh
와 /usr/share/git/completion/git-prompt.sh
내 시스템, 아치 리눅스에, 그래서 당신을 위해 동일 할 수있다.
상기 봐 가지고 호출의 섹션 man bash
특별히 쉘의 시작에 공급 명령의 모양을 원하는 경우를 - 그들은 차례로 소스에서 다른 파일을 다른 파일 소스 수 있습니다.
bash
?
$HOME/.bashrc
및 in $HOME/.profile
입니다. 참조 : linuxfromscratch.org/blfs/view/svn/postlfs/profile.html 각 파일이 공급되는시기와 방법의 세부 사항 중 일부를 설명합니다.
/etc/profile
, $HOME/.bash_profile
, $HOME/.bash_login
,의 내용과 $ENV
및 $BASH_ENV
필요 목록에 추가합니다.
에서 가능하지 않는 것 bash
, 그러나 그것은이다 zsh
:
$ type __git_ps1
> __git_ps1 is a shell function from /usr/share/git/git-prompt.sh
find
/ locate
/가 grep
.
~/.whatever
는 기본적으로 bash 와 동일한 파일을 거의 읽지 않으며이 경우와 같이 공유 위치에 정의 된 기능에 대해서만 유용한 답변을 제공합니다 ~/.bashrc
.
이것을 시도 했습니까?
grep -rnw '/path/to/somewhere/' -e "pattern"
또는 여기에있는 다른 명령 중 하나 :
Linux에서 특정 텍스트가 포함 된 모든 파일을 찾으려면 어떻게합니까? | 스택 오버플로
더 자세한 설명이 필요한 것 같습니다. 질문에 ""를 묻습니다. 따라서 다음 명령을 실행하면 bash 함수가 정의 된 모든 파일을 반환해야합니다.
grep -rnw 'Path2Search' -e "#!/bin/bash"
$PATH
, 다음type
작동하지 않습니다. 다음을 사용하여 단지 시도 할 수도find
또는locate
.locate
기존 데이터베이스를 사용하기 때문에 훨씬 빠르지 만 명령이 최근에 설치된 경우 작동하지 않습니다.