Não consigo descobrir como encontrar o arquivo onde uma função bash está definida ( __git_ps1
no meu caso).
Eu experimentei declare
,type
, which
, mas nada me diz que o arquivo de origem. Eu li em algum lugar que declare
pode imprimir o nome do arquivo e o número da linha, mas não foi explicado como. A help
página para declare
também não diz isso.
Como posso obter essas informações?
$PATH
,type
não funcionará. Você pode tentar apenas usarfind
oulocate
.locate
será muito mais rápido, pois usa um banco de dados pré-existente, mas não funcionará se o comando foi instalado recentemente.Respostas:
Se você estiver preparado para executar a função, poderá obter as informações usando
set -x
para rastrear a execução e definir aPS4
variável.Inicie o bash com
--debugger
ou use-oshopt -s extdebug
para registrar informações extras sobre depuração.Defina
PS4
o 'prompt' impresso ao rastrear para mostrar a linha de origem.Ative o rastreamento.
você pode executar sua função e, para cada linha, obterá o nome do arquivo da função.
use
set +x
para desativar o rastreamento.Então, nesse caso, você executaria
fonte
Se você não estiver disposto a executar a função, ainda poderá configurar a depuração e obter as informações. Os passos são
bash --debugger
oushopt -s extdebug
antes que a função seja definida.declare -F __git_ps1
e relatará onde a função está definida.
As vantagens deste método em comparação com o rastreamento de execução anotado no PS4 são
As vantagens do rastreamento de execução são
Eu recomendo fortemente ter
shopt -s extdebug
no início de ambos~/.bashrc
e~/.bash_profile
cobrir os diferentes arquivos usados em diferentes casos de invocação .fonte
shopt -s extdebug
for chamado depois que a função for definida. Cuidado: os números de linha podem estar desativados (um erro atual) se a função for declaradaeval
.bash --debugger
, tive que realmente ativar a conclusão para definir a função de conclusão e relatá-ladeclare -F _vpnc
.A ótima solução do @ icarus funciona para funções, desde que sejam definidas literalmente e não o resultado de um
eval
conteúdo de outro arquivo (no qual o arquivo com oeval
será exibido como fonte). Ele não imprimirá o arquivo de origem de aliases, embutidos do shell (comoecho
) e executáveis (binários ou não), e acredito que essas informações não estejam disponíveis em geral. Alguns comandos podem imprimir seus arquivos de origem (e podem até ser verdadeiros), no decorrer da execução normal ou em resposta a um sinal.__git_ps1
é definido em/usr/share/git/git-prompt.sh
e/usr/share/git/completion/git-prompt.sh
no meu sistema, Arch Linux, por isso pode ser o mesmo para você.Dê uma olhada na seção Invocação ,
man bash
caso deseje procurar comandos originados especificamente no início do shell - eles podem originar outros arquivos que, por sua vez, originam outros arquivos.fonte
bash
?$HOME/.bashrc
e dentro$HOME/.profile
. Veja: linuxfromscratch.org/blfs/view/svn/postlfs/profile.html, que explica alguns detalhes de quando e como cada arquivo é originado./etc/profile
,$HOME/.bash_profile
,$HOME/.bash_login
, E o conteúdo do$ENV
e$BASH_ENV
necessidade de ser adicionado à sua lista.Não parece possível
bash
, mas está emzsh
:fonte
find
/locate
/grep
.~/.whatever
arquivos que o bash, por padrão, e apenas fornece respostas úteis para funções definidas em locais compartilhados, como neste caso, que não são redefinidas~/.bashrc
ou o que seja.Declare uma função com o mesmo nome e defina-a somente o mais cedo possível e ative o modo xtrace, algo como:
Depois disso, ao fazer o login, você verá informações de rastreamento que incluem o fornecimento de arquivos. No momento em que houver uma tentativa de declaração da função somente leitura existente, você verá uma mensagem de erro. O último arquivo de origem antes dele deve conter a declaração que você procura.
Você pode precisar colocar isso no perfil do sistema. Lembre-se também de reverter as alterações depois de encontrar o culpado.
fonte
Você tentou isso?
ou qualquer um dos outros comandos encontrados aqui:
Como encontro todos os arquivos que contêm texto específico no Linux? | Estouro de pilha
Parece que preciso lhe dar mais explicações. Sua pergunta "" Portanto, se você executar o seguinte comando, ele deverá retornar todos os arquivos onde uma função bash estiver definida.
Programação BASH - Funções | Projeto de documentação do Linux
fonte