
Então esta captura de tela basicamente explica isso
https://gyazo.com/1a9d621efa28c7994c3a2afbe0411a2b
Eu tenho alguns alias configurados para abrir uma nova guia no terminal e fazer outras coisas, até mesmo um alias para executar o script de shell de depuração, mas o debug.sh
script simplesmente usa um alias, newtab
, para tentar abrir uma nova guia, que funciona apenas digitando newtab
, mas não funciona, nem qualquer outro alias, de dentro de um .sh ou de qualquer outro arquivo executável, como faço para corrigir isso?
Uma coisa que notei foi que estou colocando todos export
os meus 'e alias
' em /etc/bashrc
e não ~/.bash_profile
ou nos outros, e quase não vejo /etc/bashrc
menção em nenhum lugar
eu estou fazendo a coisa certa?
Responder1
A expansão do alias é feita apenas a partir do shell interativo, mas não dentro de scripts, portanto debug
é expandida para newtab
, mas newtab
não é expandida, pois é chamada a partir de um script.
Se você usar funções exportadas em vez de aliases, funcionará: –
debug() { $scripts/debug.sh; }; export -f debug
...
newtab() { $scripts/newtab.osx.sh; }; export -f newtab
A exportação é necessária, porque os scripts são executados em sub-shells, embora para a instância específica que você cita seja apenas newtab
uma função.
Funções podem ser usadas em vez de aliases em qualquer lugar, mas podem fazer muito mais, como adicionar um parâmetro extra ao final da string de execução, um requisito muito simples que os aliases não podem fazer. Na verdade, eles podem fazer qualquer coisa que os scripts podem, mas, diferentemente dos scripts, eles são executados no shell atual, para que possam alterar o ambiente e o diretório atual, para os quais um script precisa .
ou source
comando ser alcançado.