it-swarm.com.de

Wie führe ich einen Alias ​​in einem Shell-Skript aus?

Ich habe eine ausführbare Datei mpiexec, deren vollständiger Pfad ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec ist. Da ich diesen Befehl in verschiedenen Verzeichnissen ausführen möchte (ohne den gesamten Pfad erneut eingeben zu müssen), richte ich einen Alias ​​in meiner home .bashrc -Datei ein:

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

dadurch kann ich diese mpiexec -Datei auf einfache Weise mit dem Befehl Eingabeaufforderung ausführen, indem ich Folgendes eingebe:

petsc myexecutable

Ich habe versucht, eine Shell-Skriptdatei mit dem Namen script mit meinem neuen Alias ​​petsc als Befehl zu schreiben. Nachdem ich meinem Shell-Skript die entsprechenden Berechtigungen erteilt hatte (mit chmod), habe ich versucht, das Skript auszuführen. Es gab mir jedoch den folgenden Fehler:

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

Ich weiß, dass ich einfach den vollständigen Pfad zur Datei mpiexec schreiben könnte, aber es ist umständlich, den vollständigen Pfad jedes Mal zu schreiben, wenn ich ein neues Skript schreiben möchte. Kann ich meinen Alias ​​petsc in der Skriptdatei verwenden? Kann ich meinen .bashrc oder .bash_profile bearbeiten, um dies zu ermöglichen?

99
Paul
  1. Verwenden Sie in Ihrem Shell-Skript den vollständigen Pfad und nicht einen Alias.

  2. Legen Sie in Ihrem Shell-Skript eine Variable und eine andere Syntax fest

    petsc='/home/your_user/petsc-3.2-p6/petsc-Arch/bin/mpiexec'
    
    $petsc myexecutable
    
  3. Verwenden Sie eine Funktion in Ihrem Skript. Wahrscheinlich besser, wenn petsc komplex ist

    function petsc () {
        command 1
        command 2
    }
    
    petsc myexecutable
    
  4. Beschaffe deine Aliase

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

Wahrscheinlich möchten Sie Ihren .bashrc nicht als Quelle verwenden, also, IMO, wäre einer der ersten drei besser.

72
Panther

Aliase werden zugunsten von Shell-Funktionen nicht mehr empfohlen. Von der bash Manpage:

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

Fügen Sie in Ihrem ~/.bashrc Folgendes ein, um eine Funktion zu erstellen und in Subshells zu exportieren:

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

Dann können Sie Ihren Befehl von Ihren Skripten aus frei aufrufen.

57
enzotib

Shell-Funktionen und Aliase sind auf die Shell beschränkt und funktionieren nicht in ausgeführten Shell-Skripten. Alternativen für Ihren Fall:

  • (Wenn Sie sich nicht die Mühe machen, mpiexec anstelle von petsc zu verwenden) Fügen Sie $HOME/petsc-3.2-p6/petsc-Arch/bin zu Ihrer PATH -Variablen hinzu. Dies kann durch Bearbeiten von ~/.profile und Anhängen von:

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

    Melden Sie sich erneut an, um diese Änderungen zu übernehmen

  • Erstellen Sie das Verzeichnis ~/bin und

    • erstellen Sie ein Wrapper-Skript mit dem Namen petsc, das Folgendes enthält:

      #!/bin/sh
      exec ~/petsc-3.2-p6/petsc-Arch/bin/mpiexec "[email protected]"
      
    • wenn das Programm dies zulässt, können Sie das Shellscript überspringen und mit dem folgenden Befehl einen Symlink erstellen:

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

In Bash 4 können Sie eine spezielle Variable verwenden: $BASH_ALIASES .

Zum Beispiel:

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

Alternativ können Sie als Variable definieren und dann die Befehlssubstitution oder eval verwenden.

Anstatt den Alias ​​wie folgt zu definieren:

_alias foo="echo test"
_

definiere es als:

_foo="echo test"
_

stattdessen. Führen Sie es dann aus, indem Sie:

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

oder:

_find . -type f -exec sh -c "echo `$foo`" \;
_
8
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).

Die eigentliche Antwort auf diese Frage für diejenigen, die tatsächliche Aliase in Shell-Skripten anstelle von Alternativen zu diesen verwenden möchten, lautet:

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

Was warum betrifft, möchte ich Folgendes tun: Aufgrund ungewöhnlicher Umstände muss ich ein Dockerfile überlisten, dass es sich um ein Shell-Skript handelt.

5

Sie können Bash dazu zwingen, Ihr Skript als interaktive Shell mit dem Flag -i auszuführen. Dies teilt Ihrer .bashrc-Datei mit, Aliase und andere Funktionen zu definieren.

Beispiel:

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

Mehr Info:

$ man bash
5
Amado Martinez
  1. In .bash_aliases:

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

    Oder setzen Sie die Funktion in .bashrc. Normalerweise werden in .bashrc nur Konfigurationseinstellungen von bash gespeichert.

  2. Im Terminal: source .bash_aliases

  3. Nennen Sie es: petsc arg(s)

Vorteil: Sie brauchen export -f petscin .bash_aliases nicht. Aliase sind veraltet, aber die Verwendung von .bash_aliases für Funktionen ist in Ordnung.

4
Timo
  1. Verwenden Sie Ihre Aliase in Ihrem Shell-Skript.
  2. Quell dein Skript in deiner aktuellen, interaktiven Shell, anstatt es auszuführen.

Wenn Sie also eine Datei namens script.sh mit Ihren Befehlen haben, die die Verwendung von Aliasen enthalten, geben Sie einfach Folgendes ein:

source script.sh
2

(BEARBEITEN: Funktionen entfernt, da ich den Aufruf von mpiexec falsch gelesen habe.)

Wenn Sie nur weniger tippen müssen, warum legen Sie den Ordner nicht einfach in $ PATH ab? Oder aus einem Ordner in $ PATH einen Symlink zu mpiexec erstellen? Oder (mein Favorit) den Alias ​​in ein Skript einfügen, das Sie im aufrufenden Skript erstellt haben?

1
unhammer