¿Cómo usar una function bash en un alias git?

Quiero usar una function bash en un git alias. Así que agregué esto a mi .bashrc :

 fn() { echo "Hello, world!" } export -f fn 

y a mi .gitconfig :

 [alias] fn = !fn 

Pero luego git fn produce un error:

 fatal: cannot run fn: No such file or directory fatal: While expanding alias 'fn': 'fn': No such file or directory 

¿Es esta una forma correcta de usar una function bash en una definición de git alias?

No sé por qué, pero si coloco un espacio antes del nombre de la function en .gitconfig , funciona sin problemas y muestra el post:

 [alias] fn = ! fn 

Puede ser un error en git, o me falta algo en la documentation.

Eso es porque git usa /bin/sh (para que tu .bashrc no sea de origen).

Puedes llamar a bash en un git alias como se especifica en esta respuesta .

Lo que pasa es que el shell bash iniciado por el command git no carga su .profile (que es el responsable de include el .bashrc ).

Puede haber otras forms de hacerlo, pero puede solucionarlo haciendo:

 [alias] fn = !bash -c 'source $HOME/.my_functions && fn' 

Con el file .my_functions como este:

 #!/bin/bash fn() { echo "Hello, world!" } 

Incluso puede .my_functions a su .bashrc si desea que las funciones estén disponibles en los shells normales.

Si quiere estar 100% seguro de que se cumplirán las funciones exportadas, asegúrese de que el shell al que se llama es bash, no /bin/sh (lo cual no los respetará si se implementa mediante cenizas o guiones).

 fn() { echo "hello, world"; } export -f fn git config --global alias.fn $'!bash -c \'fn "$@"\' _' git fn 

… emite correctamente:

 hello, world 

La input relevante en .gitconfig :

 [alias] fn = !bash -c 'fn \"$@\"'