Ich möchte einen Alias in einem bash -c
Konstrukt ausführen .
Das bash
Handbuch sagt:
Aliase werden nicht erweitert, wenn die Shell nicht interaktiv ist, es sei denn, die
expand_aliases
Shell-Option wird mit festgelegtshopt
Warum wird in diesem Beispiel der Alias hi
beim expand_aliases
expliziten Festlegen nicht gefunden ?
% bash -O expand_aliases -c "alias hi='echo hello'; alias; shopt expand_aliases; hi"
alias hi='echo hello'
expand_aliases on
bash: hi: command not found
Ich renne GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
.
Kontext: Ich möchte in der Lage sein, einen Alias mit Leerlaufpriorität auszuführen, z. B. ein Skript mit:
#!/bin/bash
exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s expand_aliases; $(shell-quote "$@")"
Ich möchte die Verwendung vermeiden, bash -i
da ich nicht möchte, dass meine .bashrc
gelesen wird.
bash -c "hi () { echo hello; }; hi"
Ausgängehello
.zsh
: zsh Aliase erweitern nicht einmal mit Optioncomplete_aliases
Antworten:
Es scheint nicht zu funktionieren, wenn Sie den Alias in derselben Zeile festlegen, in der er verwendet wird. Wahrscheinlich etwas damit zu tun, wie Aliase sehr früh in der Befehlszeilenverarbeitung vor der eigentlichen Analysephase erweitert werden. Auf einer interaktiven Shell:
Beachten Sie, dass der verwendete Alias eine Zeile zu spät ist: Beim zweiten Befehl wird der gerade festgelegte Alias nicht gefunden, und beim dritten Befehl wird der zuvor festgelegte verwendet.
Es funktioniert also, wenn wir eine neue Zeile in die
-c
Zeichenfolge einfügen :(Sie können auch verwenden,
bash -O expand_aliases -c ...
anstattshopt
innerhalb des Skripts zu verwenden, nicht dass es bei der Newline hilft.)Alternativ können Sie eine Shell-Funktion anstelle eines Alias verwenden. Sie sind auch auf andere Weise viel besser:
quelle
Meinen Kommentar in eine Antwort verwandeln, wie von ilkkachu vorgeschlagen.
Das Bash-Handbuch (in der Frage verlinkt) enthält eine Erläuterung zum Umgang mit Aliasen, wenn sich in derselben Zeile eine Aliasdefinition und ein Befehl befinden.
Zitat (aus Gründen der Übersichtlichkeit leicht formatiert):
Die Antwort von ilkkachu bietet mehrere mögliche Lösungen für dieses Problem.
quelle