Befehlssubstitution verwenden, um mehrere Befehle auszuführen

2

Was ich versuche in Bash zu tun, ist ein Skript zu schreiben, foo, wenn ich renne $(foo)ändert das Verzeichnis und führt ein Skript aus source. Die Inhalte von foo:

echo cd bar
echo "&&"
echo source baz

Wenn ich renne $(foo)ändert das Verzeichnis in "bar", wird jedoch nicht ausgeführt source baz. Gibt es eine Möglichkeit, dies zu erreichen?

Kevin Marsolais
quelle
2
Warum sollten Sie das auch tun? Dies scheint ein wenig durchdacht und ich bin sicher, es gibt bessere Wege, um das zu erreichen, was Sie brauchen.
slhck
@slhck Ich kann die Shell nicht von einem Skript oder Programm aus beeinflussen. Die einzige Möglichkeit, die Shell zu beeinflussen, besteht in der Befehlsersetzung oder sourcealso versuche ich einen Weg zu finden, das zu tun.
Kevin Marsolais
Warum speichern Sie die Befehle, die in einer Variablen ausgeführt werden sollen?
chepner

Antworten:

2

Du musst eval die Ausgabe:

eval $(foo)

Andernfalls, && (oder ein ähnliches Sprachelement) wird so behandelt, als ob es in Anführungszeichen gesetzt wäre: ein reguläres Argument für cd.

$ echo $(foo)
cd bar && source baz

Überspringen der Führung echowürde dies ausführen cd mit den vier Argumenten bar && source bazund ließ stumm alle außer dem ersten fallen.

Daniel Beck
quelle
Beachten Sie, dass dies abhängig von Ihrer Anwendung möglicherweise keine wirklich gute Idee ist.
Daniel Beck
Scheint zu funktionieren, wenn nicht die eleganteste Lösung. Vielen Dank.
Kevin Marsolais
0

Sie können verwenden Aliase (siehe auch: Mann Bash ) zu tun, was Sie zu tun versuchen.

alias foo='cd bar && source baz'

ändert das Verzeichnis in bar und source baz, wenn Sie foo ausführen.

Dennis
quelle