it-swarm-eu.dev

Jak spustit alias ve skriptu Shell?

Mám spustitelný soubor mpiexec, jehož úplná cesta je ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec. Protože chci provést tento příkaz v různých adresářích (aniž bych musel přepisovat celou cestu), nastavím alias v mém domě .bashrc file:

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

což mi umožňuje spustit tento soubor mpiexec příkazem Prompt snadno zadáním:

petsc myexecutable

Pokusil jsem se napsat skriptový soubor Shell s názvem script, pomocí svého nového aliasu petsc jako příkazu. Poté, co jsem svému skriptu Shell poskytla příslušná oprávnění (pomocí chmod), pokusil jsem se skript spustit. Dala mi však následující chybu:

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

Vím, že jsem mohl napsat celou cestu k souboru mpiexec, ale je obtížné psát celou cestu pokaždé, když chci napsat nový skript. Existuje nějaký způsob, jak mohu použít svůj alias petsc uvnitř skriptového souboru? Existuje způsob, jak mohu upravit svůj .bashrc nebo .bash_profile aby se to stalo?

121
Paul

Některé možnosti:

  1. Ve skriptu Shell používejte spíše celou cestu než alias.

  2. Ve skriptu Shell nastavte proměnnou, jinou syntaxi

    petsc='/home/your_user/petsc-3.2-p6/petsc-Arch/bin/mpiexec'
    
    $petsc myexecutable
    
  3. Použijte funkci ve skriptu. Pravděpodobně lepší, pokud je složka petsc

    function petsc () {
        command 1
        command 2
    }
    
    petsc myexecutable
    
  4. Zdrojové aliasy

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

Pravděpodobně nebudete chtít získat zdroj .bashrc, takže IMO jeden z prvních 3 by byl lepší.

84
Panther

Aliasy jsou zastaralé ve prospěch funkcí Shell. Ze stránky bash manual page :

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

Chcete-li vytvořit funkci a exportovat ji do subshells, vložte do svého ~/.bashrc:

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

Pak můžete volně volat svůj příkaz ze svých skriptů.

77
enzotib

Funkce Shell a aliasy jsou omezeny na Shell a nefungují ve spuštěných skriptech Shell. Alternativy pro váš případ:

  • (Pokud se neobtěžujete používat mpiexec místo petsc) Přidat $HOME/petsc-3.2-p6/petsc-Arch/bin do vaší proměnné PATH. To lze provést úpravou ~/.profile a připojuje se:

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

    Chcete-li tyto změny použít, znovu se přihlaste

  • Vytvořit adresář ~/bin a

    • vytvořte skript wrapper s názvem petsc obsahující:

      #!/bin/sh
      exec ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "[email protected]"
      
    • pokud to program umožňuje, můžete přeskočit shellscript a udělat symbolický odkaz pomocí příkazu:

      ln -s ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec ~/bin/petsc
      
15
Lekensteyn

V bash 4 můžete použít speciální proměnnou: $BASH_ALIASES .

Například:

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

Případně definujte jako proměnnou, pak použijte substituci příkazu nebo eval.

Tak například místo definování aliasu, jako například:

alias foo="echo test"

definovat to jako:

foo="echo test"

namísto. Poté proveďte buď:

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

nebo:

find . -type f -exec sh -c "echo `$foo`" \;
12
kenorb
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).

Skutečná odpověď na tuto otázku je tedy pro ty, kteří hledají použití skutečných aliasů ve skriptech Shell místo alternativ k nim:

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

Pokud jde o proč Chtěl bych to udělat: Kvůli neobvyklým okolnostem musím přimět Dockerfile, aby si myslel, že je to Shell skript.

10

Můžete vynutit bash, aby spustil skript jako interaktivní Shell s příznakem -i. Toto řekne vašemu . Bashrc file , aby definoval aliasy a další funkce.

Příklad:

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

Více informací:

$ man bash
9
Amado Martinez
  1. V .bash_aliases:

    petsc {
    ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "[email protected]"
    }
    

    Nebo vložte funkci do .bashrc. Obvykle jsou v .bashrc Uložena pouze konfigurační nastavení bash.

  2. V terminálu: source .bash_aliases

  3. Říkejte tomu: petsc arg(s)

Výhoda: nepotřebujete export -f petsc V .bash_aliases. Aliasy jsou zastaralé, ale použití funkcí .bash_aliases Je v pořádku.

5
Timo
  1. Použijte své aliasy ve skriptu Shell.
  2. Zdroj skriptu v aktuální interaktivní interaktivní prostředí namísto spuštění.

Pokud tedy máte soubor s názvem script.sh s příkazy, které zahrnují použití aliasu, jednoduše napište:

source script.sh
3

(ÚPRAVA: odstraněné funkce, protože jsem špatně vykládal volání mpiexec.)

Pokud jediné, co potřebujete, je méně psaní, proč prostě nedáte složku do $ PATH? Nebo udělejte symbolický odkaz na mpiexec z nějaké složky v $ PATH? Nebo (můj oblíbený) dal alias do skriptu, který jste zdrojem ve volajícím skriptu?

2
unhammer