Como executar um alias em um script de shell?

79

Eu tenho um arquivo executável mpiexec , cujo caminho completo é ~/petsc-3.2-p6/petsc-arch/bin/mpiexec . Desde que eu quero executar este comando em diretórios diferentes (sem ter que redigitar o caminho inteiro), eu configurei um alias em minha casa .bashrc file:

alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"  

que me permite executar este arquivo mpiexec no prompt de comando facilmente digitando:

petsc myexecutable

Eu tentei escrever um arquivo de script de shell, chamado script , usando meu novo alias petsc como um comando. Depois de dar ao meu shell script as permissões apropriadas (usando chmod ), tentei executar o script. No entanto, deu-me o seguinte erro:

./script: line 1: petsc: command not found

Eu sei que eu poderia escrever o caminho completo para o arquivo mpiexec , mas é complicado escrever o caminho completo toda vez que eu quero escrever um novo script. Existe uma maneira que eu possa usar meu alias petsc dentro do arquivo de script? Existe uma maneira de editar meu .bashrc ou .bash_profile para que isso aconteça?

    
por Paul 26.01.2012 / 19:11

9 respostas

58
  1. Em seu script de shell, use o caminho completo em vez de um alias.

  2. Em seu script de shell, defina uma variável, uma sintaxe diferente

    petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
    
    $petsc myexecutable
    
  3. Use uma função no seu script. Provavelmente melhor se petsc for complexo

    function petsc () {
        command 1
        command 2
    }
    
    petsc myexecutable
    
  4. Fonte dos seus aliases

    shopt -s expand_aliases
    source /home/your_user/.bashrc
    

Você provavelmente não deseja obter seu .bashrc , portanto, IMO, um dos três primeiros seria melhor.

    
por Panther 26.01.2012 / 19:19
49

Os aliases são obsoletos em favor das funções do shell. Na página de manual bash :

% bl0ck_qu0te%

Para criar uma função e exportá-la para subshells, coloque o seguinte no seu ~/.bashrc :

petsc() {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
}
export -f petsc

Então você pode chamar livremente seu comando dos seus scripts.

    
por enzotib 26.01.2012 / 19:28
11

As funções e aliases do shell são limitadas ao shell e não funcionam em scripts de shell executados. Alternativas para o seu caso:

  • (se você não se incomodar em usar mpiexec em vez de petsc ) Adicione $HOME/petsc-3.2-p6/petsc-arch/bin à sua variável PATH . Isso pode ser feito editando ~/.profile e anexando:

    PATH="$HOME/petsc-3.2-p6/petsc-arch/bin:$PATH"
    

    Faça login novamente para aplicar essas alterações

  • Crie o diretório ~/bin e

    • crie um script de wrapper chamado petsc contendo:

      #!/bin/sh
      exec ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
      
    • se o programa permitir, você pode pular o shellscript e fazer um symlink usando o comando:

      ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc
      
por Lekensteyn 26.01.2012 / 19:52
6

No bash 4 você pode usar uma variável especial: $BASH_ALIASES .

Por exemplo:

$ alias foo="echo test"
$ echo ${BASH_ALIASES[foo]}
echo test
$ echo '${BASH_ALIASES[foo]}' bar
test bar

Como alternativa, defina como variável, em seguida, use substituição de comando ou eval .

Por exemplo, em vez de definir o alias como:

alias foo="echo test"

defina como:

foo="echo test"

em vez disso. Em seguida, execute-o por:

find . -type f -exec sh -c "eval $foo" \;

ou:

find . -type f -exec sh -c "echo '$foo'" \;
    
por kenorb 02.06.2015 / 00:31
3

Você pode forçar o bash a executar seu script como um shell interativo com o sinalizador -i. Isso informará o seu arquivo .bashrc para definir aliases e outras funções.

Exemplo:

~ $ grep ll .bashrc
alias ll='ls -lah'
~ $ cat script.sh 
#!/bin/sh

ll
~ $ bash script.sh 
script.sh: line 3: ll: command not found
~ $ bash -i script.sh
..directory contents..

Mais informações:

$ man bash
    
por Amado Martinez 10.01.2017 / 09:03
3
  1. Em .bash_aliases :

    petsc { ~ / petsc-3.2-p6 / petsc-arch / bin / mpiexec "$ @" }

Ou coloque a função em .bashrc se você a chamar com frequência. Diga-se que, em .bashrc , apenas as configurações de bash são armazenadas.

  1. No terminal: source .bash_aliases
  2. petsc arg(s)

Vantagem: você não precisa de export -f petsc em .bash_aliases . Os aliases são obsoletos, mas suponho que usar .bash_aliases não seja.

    
por Timo 28.03.2015 / 10:07
2
  1. Use seus aliases no seu script de shell.
  2. Crie o seu script no seu shell interativo atual, em vez de executá-lo.

Portanto, se você tiver um arquivo chamado script.sh com seus comandos que incluem aliases, basta digitar:

source script.sh
    
por Gordon Erlebacher 25.07.2016 / 02:00
1

(EDIT: removeu funções desde que eu interpretei errado o mpiexec.)

Se a única coisa que você precisa é de menos digitação, por que você não coloca a pasta em $ PATH? Ou faça um link simbólico para o mpiexec de alguma pasta em $ PATH? Ou (meu favorito) colocar o alias em um script que você fonte no script de chamada?

    
por unhammer 26.01.2012 / 20:22
1
ALIASES
   ...
   Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS
   below).

Assim, a resposta real a essa pergunta, para quem procura usar aliases reais em scripts de shell, em vez de alternativas para eles, é:

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

Quanto a por que eu quero fazer isso: devido a circunstâncias incomuns, eu preciso enganar um Dockerfile para pensar que é um script de shell.

    
por Throwaway Account 3 Million 18.07.2018 / 02:50