Tradicionalmente, as funções bash são colocadas em ~/.bashrc
, pois são lidas por bashes interativos. ~/.profile
é lido apenas por bashes de login. Novas janelas geralmente não executam bashes de login.
O que estou fazendo errado ...? Tudo bem se eu fizer isso na linha de comando e, em seguida, chamá-lo, mas não quando eu carregá-lo de .profile. Linux Mint Qiana, Bash 4. *, se for importante.
function android() { command /opt/android-studio/bin/studio.sh "$@" & disown ; }
export -f android
Eu tentei encurtar o comando, estendendo-o, removendo o ponto-e-vírgula e usando uma nova linha ... Acho que ainda não encontrei o compromisso feliz. Nenhum erro quando executado na linha de comando e a função funciona como atualmente está listado acima.
Notas: Por "load" quero dizer para abrir uma nova sessão de terminal com o mesmo usuário cujo .profile estou editando ... e estou usando coisas como function
, command
e disown
porque eu comecei com uma versão básica desta função, mas não estava funcionando, comecei a adicionar e remover coisas para tentar obter a combinação correta de coisas. Tudo correu bem na linha de comando.
No Ubuntu e no Linux Mint, a maioria das maneiras de iniciar uma sessão da GUI, incluindo a que eu acredito ser a padrão, faz com que /etc/profile
e ~/.profile
sejam lidos por /bin/sh
, não por bash. /bin/sh
é dash, um shell que é mais rápido e usa menos memória que o bash, mas não possui alguns de seus recursos, como a exportação de função. Seu ~/.xsession-errors
deve conter linhas como .profile: 42: export: Illegal option -f
.
Em vez de colocar suas funções no ambiente, defina-as no arquivo de inicialização para shells interativos: ~/.bashrc
. Não há nenhum ponto em exportá-los, pois o arquivo é lido por cada shell interativo, e os shells não interativos serão principalmente sh, não bash, então eles não importarão a função - e mesmo assim disown
não é útil em um shell -interactive shell.