Ich habe eine ausführbare Datei mpiexec
, deren vollständiger Pfad ist ~/petsc-3.2-p6/petsc-arch/bin/mpiexec
. Da ich diesen Befehl in verschiedenen Verzeichnissen ausführen möchte (ohne den gesamten Pfad erneut eingeben zu müssen), richte ich in meiner Ausgangsdatei einen Alias ein .bashrc
:
alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"
Dadurch kann ich diese mpiexec
Datei einfach an der Eingabeaufforderung ausführen, indem ich Folgendes eingebe:
petsc myexecutable
Ich habe versucht, eine Shell-Skriptdatei mit dem Namen zu schreiben script
, wobei mein neuer Alias petsc
als Befehl verwendet wurde. Nachdem ich meinem Shell-Skript die entsprechenden Berechtigungen erteilt hatte (mithilfe von chmod
), versuchte ich, 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 mpiexec
Datei 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? Gibt es eine Möglichkeit, meine zu bearbeiten .bashrc
oder .bash_profile
um dies zu ermöglichen?
.bash_aliases
? Wie wäre es auch mit einem Aliasing des absoluten Pfades anstelle eines relativen Pfades wiealias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
Antworten:
Verwenden Sie in Ihrem Shell-Skript den vollständigen Pfad und nicht einen Alias.
Legen Sie in Ihrem Shell-Skript eine Variable und eine andere Syntax fest
Verwenden Sie eine Funktion in Ihrem Skript. Wahrscheinlich besser, wenn
petsc
es komplex istBeschaffe deine Aliase
Sie wollen wahrscheinlich nicht Ihre Quelle
.bashrc
, also, IMO, wäre eine der ersten 3 besser.quelle
shopt -s expand_aliases
dasselbe Skript.|
. Verwenden Sie hiershopt -s expand_aliases
& local alias, z. B.alias myalias='echo abc|rev'
- erfordert vor der Verwendung einen Zeilenumbruch (siehe ALIASES inman bash
). Punkt 4: Ausgelagerte Datei kann die nicht interaktive Ausführung, dh in einem Skript, verhindern. Suchen Sie nach frühexit
oderreturn
, zum Beispiel[ -z "$PS1" ] && return
( überprüft , ob primäre Eingabeaufforderung nicht gesetzt anzeigt , nicht-interaktiv Shell) oder es kann eine Prüfung für seinei
in$-
($-
enthält Shell - Optionen,i
bedeutet interaktiv). Sieheman bash
für diese Variablen.Aliase werden zugunsten von Shell-Funktionen abgelehnt. Von der
bash
Manualseite:Um eine Funktion zu erstellen und in Unterschalen zu exportieren, fügen Sie Folgendes in Ihre
~/.bashrc
:Dann können Sie Ihren Befehl von Ihren Skripten aus frei aufrufen.
quelle
"$@"
nur hinzugefügt , um mit Argumenten umzugehen .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
statt zu verwendenpetsc
) Fügen Sie$HOME/petsc-3.2-p6/petsc-arch/bin
IhrerPATH
Variablen hinzu. Dies kann durch Bearbeiten~/.profile
und Anhängen erfolgen:Melden Sie sich erneut an, um diese Änderungen zu übernehmen
Erstellen Sie das Verzeichnis
~/bin
undErstelle ein Wrapper-Skript mit dem Namen
petsc
:Wenn das Programm dies zulässt, können Sie das Shellscript überspringen und mit dem folgenden Befehl einen Symlink erstellen:
quelle
In bash 4 können Sie spezielle Variable verwenden:
$BASH_ALIASES
.Zum Beispiel:
Alternativ können Sie als Variable definieren und dann die Befehlssubstitution oder verwenden
eval
.Anstatt den Alias wie folgt zu definieren:
definiere es als:
stattdessen. Führen Sie es dann aus, indem Sie entweder:
oder:
quelle
${BASH_ALIASES[alias]}
ist das eine nette Option. Ansonsten musste ich viele Zeilen meiner .bash_aliases bearbeiten, um andere Dinge anzuwenden. Danke.Sie können Bash zwingen, Ihr Skript als interaktive Shell mit dem Flag -i auszuführen. Dadurch wird Ihre .bashrc-Datei angewiesen , Aliase und andere Funktionen zu definieren.
Beispiel:
Mehr Info:
quelle
.bashrc
wird auch während der nicht interaktiven Ausführung von SSH-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:
Was den Grund betrifft, warum ich das tun möchte: Aufgrund ungewöhnlicher Umstände muss ich ein Dockerfile täuschen, dass es sich um ein Shell-Skript handelt.
quelle
In
.bash_aliases
:Oder setzen Sie die Funktion in
.bashrc
. Normalerweise werden in.bashrc
config nur Einstellungen vonbash
gespeichert.Im Terminal:
source .bash_aliases
petsc arg(s)
Vorteil: Sie brauchen nicht
export -f petsc
in.bash_aliases
. Aliase sind veraltet, aber die Verwendung.bash_aliases
für Funktionen ist in Ordnung.quelle
Wenn Sie also eine Datei
script.sh
mit Ihren Befehlen haben, die die Verwendung von Aliasen enthalten, geben Sie einfach Folgendes ein:quelle
.
oder demsource
Befehl erstellen, führt die aktuelle Shell alle darin enthaltenen Befehle aus. Wenn eine Aliaserweiterung in der Shell erfolgen würde, in der.
oder ausgeführtsource
wird, tritt sie auf. Es ist jedoch wichtig zu wissen, dass diese Methode nur manchmal nützlich ist, da häufig ein Skript in einer eigenen Shell mit eigener Umgebung ausgeführt werden muss oder möchte. Shell-Skripte, die in der Absicht geschrieben wurden, auf die übliche Weise ausgeführt zu werden, sollten normalerweise nicht als Quelle verwendet werden - sie funktionieren oft nicht richtig.(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?
quelle
"$@"
.