No puedo entender cómo encontrar el archivo donde se define una función bash ( __git_ps1
en mi caso).
Experimenté con declare
, type
, which
, pero nada me dice que el archivo de origen. Leí en alguna parte que declare
puede imprimir el nombre del archivo y el número de línea, pero no se explicó cómo. La help
página para declare
tampoco lo dice.
¿Cómo puedo obtener esta información?
$PATH
, entoncestype
no funcionará. Es posible que desee probar simplemente usandofind
olocate
.locate
será mucho más rápido, ya que usa una base de datos preexistente, pero no funcionará si el comando se instaló recientemente.Respuestas:
Si está preparado para ejecutar la función, puede obtener la información utilizando
set -x
para rastrear la ejecución y establecer laPS4
variable.Comience bash con
--debugger
o useshopt -s extdebug
para grabar información adicional de depuración.Establezca
PS4
, el 'aviso' impreso al rastrear para mostrar la línea de origen.Activa el rastreo.
luego puede ejecutar su función y para cada línea obtendrá el nombre de archivo de la función.
se usa
set +x
para desactivar el rastreo.Entonces para este caso correrás
fuente
Si no está dispuesto a ejecutar la función, aún puede configurar la depuración y obtener la información. Los pasos son
bash --debugger
oshopt -s extdebug
antes de que se defina la función.declare -F __git_ps1
e informará dónde se define la función.
Las ventajas de este método en comparación con ver el seguimiento de ejecución anotado con PS4 son
Las ventajas de la traza de ejecución son
Recomiendo encarecidamente tener
shopt -s extdebug
al principio de ambos~/.bashrc
y~/.bash_profile
cubrir los diferentes archivos utilizados en diferentes casos de Invocación .fuente
shopt -s extdebug
se llama después de definir la función. Tenga en cuenta que los números de línea pueden estar desactivados (un error actual) si la función se declara a través deeval
.bash --debugger
tuve que activar la finalización para definir la función de finalización y obtener un informedeclare -F _vpnc
.La gran solución de @ icarus funciona para funciones, siempre que se definan literalmente y no el resultado de uno
eval
de los contenidos de otro archivo (en el que el archivo con eleval
aparecerá como la fuente). No imprimirá el archivo fuente de alias, integraciones de shell (comoecho
) y ejecutables (binarios o no), y creo que esta información no está disponible en general. Algunos comandos pueden imprimir sus archivos fuente (e incluso pueden ser sinceros al respecto), ya sea en el curso de la ejecución normal o en respuesta a una señal.__git_ps1
está definido en/usr/share/git/git-prompt.sh
y/usr/share/git/completion/git-prompt.sh
en mi sistema, Arch Linux, por lo que puede ser lo mismo para usted.Eche un vistazo a la sección Invocación de
man bash
si desea buscar comandos específicamente originados al inicio del shell: pueden obtener otros archivos que a su vez obtienen otros archivos.fuente
bash
?$HOME/.bashrc
y in$HOME/.profile
. Consulte: linuxfromscratch.org/blfs/view/svn/postlfs/profile.html que explica algunos de los detalles de cuándo y cómo se obtiene cada archivo./etc/profile
,$HOME/.bash_profile
,$HOME/.bash_login
, Y el contenido de$ENV
y$BASH_ENV
necesidad de ser añadidos a la lista.No parece posible en
bash
, pero está enzsh
:fuente
find
/locate
/grep
.~/.whatever
archivos que bash de manera predeterminada, y solo dará respuestas útiles para funciones definidas en ubicaciones compartidas como en este caso, que no se redefinen~/.bashrc
ni nada .Declare una función con el mismo nombre y configúrela como de solo lectura lo antes posible, luego active el modo xtrace, algo así como:
Después de eso, cuando inicie sesión, verá información de rastreo que incluye el abastecimiento de archivos. En el momento en que se intente declarar la función de solo lectura existente, verá un mensaje de error. El último archivo de origen antes de que contenga la declaración que busca.
Es posible que deba poner esto en el perfil de bash del sistema. También recuerde revertir los cambios después de encontrar al culpable.
fuente
¿Intentaste esto?
o cualquiera de los otros comandos encontrados aquí:
¿Cómo encuentro todos los archivos que contienen texto específico en Linux? El | Desbordamiento de pila
Parece que necesito darte más explicaciones. Su pregunta es "" Por lo tanto, si ejecuta el siguiente comando, debería devolver todos los archivos donde se define una función bash.
Programación BASH - Funciones | Proyecto de documentación de Linux
fuente