
Mein Bash-Skript hat einige Funktionen und ich brauche einen Tmux-Bereich, um die Funktion innerhalb des Bash-Skripts auszuführen. Der folgende Code funktioniert beispielsweise nicht und es wird gemeldet, dass der Befehl „intern“ nicht gefunden wurde.
common() {
internal() {
echo "Function executed"
}
SESSIONNAME="ses"
tmux new-session -s $SESSIONNAME -n session -d
tmux split-window -t $SESSIONNAME:0 -h
tmux send-keys 'internal' 'C-m'
tmux select-window -t $SESSIONNAME:0
tmux attach -t $SESSIONNAME
}
Wie kann ich tmux also anweisen, eine Funktion aus dem Skript auszuführen, in dem das tmux-Fenster aufgerufen wurde?
Antwort1
Ich habe eine Bash-Funktion geschrieben, die eine Funktion als Argument verwendet und sie mit „Send-Keys“ in eine Tmux-Sitzung lädt. Natürlich muss im empfangenden Tmux-Fenster Bash oder etwas Kompatibles ausgeführt werden, wenn diese Funktion ausgeführt wird.
_pass_to_tmux() {
_FUNC_TO_PASS="${1}"
_IFS_BACKUP="${IFS}"
IFS=$'\n'
for i in $(type ${_FUNC_TO_PASS} | tail -n +2); do
tmux send-keys "${i}" C-m
done
IFS="${_IFS_BACKUP}"
}
Antwort2
Soweit ich weiß, kann man Shell-Funktionen nicht in eine tmux-Instanz exportieren. Zumindest in der Version 1.9 der tmux-Manpage gibt es keinen Hinweis darauf.
Ich glaube nicht, dass das überhaupt möglich ist, da der Kontext des Skripts, in dem Sie die tmux-Sitzung erstellen, völlig anders ist als der Kontext innerhalb der tmux-Sitzung. Daher kann es diese Funktionen nicht einmal kennen. Außerdem verwendet tmux möglicherweise sogar eine andere Shell als die, die Sie verwenden.
Um jedoch einige Alternativen anzubieten, können Sie Folgendes tun:
- Schreiben Sie ein anderes Skript, fügen Sie Ihre
internal
Funktion darin ein und verwenden Sie dieses stattdessen. - Schreib einBibliothekSkript, das alle Ihre Funktionen enthält, aber sonst nichts,
source
dieses Bibliotheksskript inAnwendungSkripte, sodass deren Funktionen dort verfügbar werden, und verwenden Sie stattdessen diese Anwendungsskripte.
Die zweite Alternative bietet Ihnen außerdem mehr Codehygiene und bessere Wiederverwendbarkeit.