Eu tenho um arquivo executável mpiexec
, cujo caminho completo é ~/petsc-3.2-p6/petsc-arch/bin/mpiexec
. Como desejo executar esse comando em diretórios diferentes (sem precisar redigitar o caminho inteiro), configurei um alias no meu .bashrc
arquivo inicial :
alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"
o que me permite executar esse mpiexec
arquivo no prompt de comando facilmente, digitando:
petsc myexecutable
Tentei escrever um arquivo de script de shell, nomeado script
, usando meu novo alias petsc
como comando. Depois de dar ao meu shell script as permissões apropriadas (usando chmod
), tentei executar o script. No entanto, ele me deu o seguinte erro:
./script: line 1: petsc: command not found
Eu sei que eu poderia escrever o caminho completo para o mpiexec
arquivo, mas é complicado escrever o caminho completo toda vez que eu quiser escrever um novo script. Existe uma maneira de usar meu alias petsc
dentro do arquivo de script? Existe uma maneira de editar .bashrc
ou .bash_profile
fazer isso acontecer?
.bash_aliases
? Também que tal aliasing o caminho absoluto em vez de caminho relativo comoalias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
Respostas:
No seu script de shell, use o caminho completo em vez de um alias.
No seu script de shell, defina uma sintaxe variável e diferente
Use uma função no seu script. Provavelmente melhor se
petsc
for complexoCrie seus aliases
Você provavelmente não deseja obter sua
.bashrc
, portanto, na IMO, um dos três primeiros seria melhor.fonte
shopt -s expand_aliases
o mesmo script.|
. Aqui, useshopt -s expand_aliases
& alias local, por exemploalias myalias='echo abc|rev'
- requer quebra de linha antes do uso (consulte ALIASES emman bash
). Ponto 4: o arquivo originado pode impedir a execução não interativa, ou seja, em um script. Procure antecipadamenteexit
oureturn
, por exemplo,[ -z "$PS1" ] && return
(verifica se o prompt principal não está definido, indicando shell não interativo) ou pode haver um check-i
in$-
($-
contém opções de shell,i
significa interativo). Vejaman bash
para essas variáveis.Os aliases foram descontinuados em favor das funções do shell. Na
bash
página do manual:Para criar uma função e exportá-la para subshells, coloque o seguinte em seu
~/.bashrc
:Em seguida, você pode chamar seu comando livremente de seus scripts.
fonte
"$@"
apenas para lidar com argumentos.As funções e aliases do shell são limitados ao shell e não funcionam em scripts de shell executados. Alternativas para o seu caso:
(se você não se incomodar em usar em
mpiexec
vez depetsc
) Adicione$HOME/petsc-3.2-p6/petsc-arch/bin
à suaPATH
variável. Isso pode ser feito editando~/.profile
e anexando:Faça login novamente para aplicar essas alterações
Crie o diretório
~/bin
ecrie um script de wrapper chamado
petsc
contendo:se o programa permitir, você pode pular o shellscript e criar um link simbólico usando o comando:
fonte
No bash 4 você pode usar variável especial:
$BASH_ALIASES
.Por exemplo:
Alternativamente, defina como variável e use a substituição de comando ou
eval
.Por exemplo, em vez de definir o alias, como:
defina-o como:
em vez de. Em seguida, execute-o:
ou:
fonte
${BASH_ALIASES[alias]}
é uma boa opção. Caso contrário, eu tive que editar muitas linhas dos meus .bash_aliases para aplicar outras coisas. Obrigado.Você pode forçar o bash a executar seu script como um shell interativo com o sinalizador -i. Isso informará o arquivo .bashrc para definir aliases e outras funções.
Exemplo:
Mais informações:
fonte
.bashrc
Também é lido durante a execução do comando SSH não-interativo (é por isso que ele tem um cheque de interatividade no topo)Portanto, a resposta real para essa pergunta, para quem procura usar aliases reais em scripts de shell em vez de alternativas a eles, é:
Quanto ao motivo pelo qual gostaria de fazer isso: devido a circunstâncias incomuns, preciso induzir um Dockerfile a pensar que é um script de shell.
fonte
Em
.bash_aliases
:Ou colocar a função na
.bashrc
. Geralmente,.bashrc
apenas as configurações debash
são armazenadas.No terminal:
source .bash_aliases
petsc arg(s)
Vantagem: você não precisa
export -f petsc
de.bash_aliases
. Os aliases foram descontinuados, mas o uso.bash_aliases
de funções está ok.fonte
Portanto, se você tiver um arquivo chamado
script.sh
com seus comandos que inclua o uso de aliases, basta digitar:fonte
.
ousource
buiiltin faz com que o shell atual execute todos os comandos nele. Se a expansão do alias ocorrer no shell em que.
ousource
for executado, isso ocorrerá. No entanto, é importante perceber que esse método é útil apenas algumas vezes, porque geralmente é necessário ou desejado a execução de um script em seu próprio shell, com seu próprio ambiente. Os scripts de shell escritos com a intenção de serem executados da maneira usual geralmente não devem ser originados - eles geralmente não funcionam corretamente.(Edição: funções removidas desde que eu li mal a chamada do mpiexec.)
Se a única coisa que você precisa é menos digitação, por que não coloca a pasta no $ PATH? Ou faça um link simbólico para mpiexec a partir de alguma pasta em $ PATH? Ou (o meu favorito) coloca o alias em um script que você obtém no script de chamada?
fonte
"$@"
.