Come eseguire un alias in uno script di shell?

75

Ho un file eseguibile mpiexec , il cui percorso completo è ~/petsc-3.2-p6/petsc-arch/bin/mpiexec . Dal momento che voglio eseguire questo comando in diverse directory (senza dover ridigitare l'intero percorso), ho impostato un alias nel mio file .bashrc di casa:

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

che mi consente di eseguire questo file mpiexec al prompt dei comandi facilmente digitando:

petsc myexecutable

Ho provato a scrivere un file script di shell, chiamato script , usando il mio nuovo alias petsc come comando. Dopo aver dato allo script della shell le autorizzazioni appropriate (usando chmod ), ho provato a eseguire lo script. Tuttavia, mi ha dato il seguente errore:

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

So che potrei semplicemente scrivere il percorso completo del file mpiexec , ma è complicato scrivere il percorso completo ogni volta che voglio scrivere un nuovo script. C'è un modo per utilizzare il mio alias petsc all'interno del file di script? C'è un modo per modificare il mio .bashrc o .bash_profile per far sì che questo accada?

    
posta Paul 26.01.2012 - 19:11

9 risposte

56
  1. Nello script della shell usa il percorso completo piuttosto che un alias.

  2. Nello script della shell, imposta una variabile, sintassi diversa

    petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
    
    $petsc myexecutable
    
  3. Usa una funzione nel tuo script. Probabilmente è meglio se petsc è complesso

    function petsc () {
        command 1
        command 2
    }
    
    petsc myexecutable
    
  4. Sorgenti i tuoi alias

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

Probabilmente non vuoi generare il tuo .bashrc , quindi, IMO, uno dei primi 3 sarebbe meglio.

    
risposta data Panther 26.01.2012 - 19:19
48

Gli alias sono deprecati a favore delle funzioni della shell. Dalla pagina di manuale bash :

For almost every purpose, aliases are superseded by shell functions.

Per creare una funzione ed esportarla in subshell, inserisci quanto segue in ~/.bashrc :

petsc() {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
}
export -f petsc

Quindi puoi chiamare liberamente il tuo comando dai tuoi script.

    
risposta data enzotib 26.01.2012 - 19:28
10

Le funzioni e gli alias della shell sono limitati alla shell e non funzionano negli script della shell eseguiti. Alternative per il tuo caso:

  • (se non ti preoccupi di usare mpiexec invece di petsc ) Aggiungi $HOME/petsc-3.2-p6/petsc-arch/bin alla tua variabile PATH . Questo può essere fatto modificando ~/.profile e aggiungendo:

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

    Riconnetti per applicare queste modifiche

  • Crea la directory ~/bin e

    • crea uno script wrapper denominato petsc contenente:

      #!/bin/sh
      exec ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
      
    • se il programma lo consente, puoi saltare lo shell script e creare un link simbolico usando il comando:

      ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc
      
risposta data Lekensteyn 26.01.2012 - 19:52
4

In bash 4 puoi utilizzare la variabile speciale: $BASH_ALIASES .

Ad esempio:

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

In alternativa definisci come variabile, quindi usa la sostituzione di comando o eval .

Ad esempio, invece di definire l'alias come:

alias foo="echo test"

definirlo come:

foo="echo test"

, invece. Quindi eseguirlo con:

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

o

find . -type f -exec sh -c "echo '$foo'" \;
    
risposta data kenorb 02.06.2015 - 00:31
2

Potresti inserire il seguente codice in .bash_aliases :

petsc() {
~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
}

Quindi devi source .bash_aliases del file. Quindi chiamalo: petsc arg .

Vantaggio: non è necessario il export -f petsc in bash_aliases . Gli alias sono deprecati, ma suppongo che solo usando .bash_aliases non lo sia.

    
risposta data Timo 28.03.2015 - 10:07
2

Puoi forzare bash ad eseguire il tuo script come una shell interattiva con il flag -i. Questo dirà al tuo file .bashrc per definire alias e altre funzioni.

Esempio:

~ $ 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..

Altre informazioni:

$ man bash
    
risposta data Amado Martinez 10.01.2017 - 09:03
1
  1. Utilizza i tuoi alias nello script della shell.
  2. Sorgente il tuo script nella tua shell interattiva, invece di eseguirla.

Quindi se hai un file chiamato script.sh con i tuoi comandi che includono l'utilizzo di alias, digita semplicemente:

source script.sh
    
risposta data Gordon Erlebacher 25.07.2016 - 02:00
0

(MODIFICA: funzioni rimosse da quando ho letto erroneamente le chiamate di mpiexec.)

Se l'unica cosa di cui hai bisogno è meno digitata, perché non metti la cartella in $ PATH? Oppure creare un collegamento simbolico a mpiexec da una cartella in $ PATH? O (il mio preferito) metti l'alias in uno script che tu fornisci nello script chiamante?

    
risposta data unhammer 26.01.2012 - 20:22
0
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).

Quindi la vera risposta a questa domanda, per coloro che cercano di utilizzare alias effettivi negli script di shell invece di alternative a loro, è:

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

Per quanto riguarda perché vorrei fare questo: a causa di circostanze insolite, ho bisogno di ingannare un Dockerfile pensando che sia uno script di shell.

    
risposta data Throwaway Account 3 Million 18.07.2018 - 02:50

Leggi altre domande sui tag