
Ich verwende Bash 4.3.11(1) und habe das folgende History-Plugin installiert (via.bash_it):
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
bind '"^[[B":history-search-forward'
Wenn ich mich bei einer interaktiven Sitzung anmelde, ist alles in Ordnung, aber wenn ich beispielsweise Remotebefehle ausführe ssh host 'ls -als'
, sehe ich die folgende Ausgabe:
: ssh host 'ls -als'
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 3: bind: warning: line editing not enabled
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 4: bind: warning: line editing not enabled
Wenn ich das Verlaufs-Plugin echo -e '\0033\0143'
nach jedem Bind-Aufruf ändere, erhalte ich keine Warnungen mehr, aber meine Konsole wird gelöscht. Das ist kein großer Nachteil, aber es wäre schön, eine sauberere Möglichkeit zu kennen, dies für Remote-Befehle zu unterdrücken.
# Works, but annoyingly clears console
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
echo -e '\0033\0143'
bind '"^[[B":history-search-forward'
echo -e '\0033\0143'
Antwort1
Eine interaktive Sitzung reicht nicht aus, damit bind
es funktioniert. Beispielsweise bietet die Emacs-Shell eine interaktive Sitzung, die den if [ -t 1 ]
Test besteht, aber keine Zeilenbearbeitung unterstützt, sodass jedes bind
s in Ihrer ~/.bashrc
Sitzung Warnungen erzeugt. Stattdessen können Sie prüfen, ob die Zeilenbearbeitung aktiviert ist, indem Sie Folgendes tun (gibt es einen einfacheren/besseren Weg?):
if [[ "$(set -o | grep 'emacs\|\bvi\b' | cut -f2 | tr '\n' ':')" != 'off:off:' ]]; then
echo "line editing is on"
fi
Antwort2
ssh host 'ls -als'
Wenn Sie ssh auffordern, einen Befehl auf dem Remote-System auszuführen, weist ssh der Remote-Sitzung normalerweise kein PTY (Pseudo-TTY) zu. Sie können ssh mit ausführen, -t
um es zur Zuweisung eines TTY zu zwingen:
ssh -t host 'ls -als'
Wenn Sie das nicht jedes Mal eingeben möchten, können Sie diese Zeile zur Datei „.ssh/config“ auf Ihrem lokalen Host hinzufügen:
RequestTTY yes
Alternativ können Sie die Datei „.bashrc“ auf Ihrem Remote-System reparieren, um die Ausführung von Befehlen zu vermeiden, die davon ausgehen, dass die Sitzung interaktiv ist, obwohl dies nicht der Fall ist. Eine Möglichkeit besteht darin, die Befehle in einen Test einzuschließen, dass die Sitzung über ein TTY verfügt:
if [ -t 1 ]
then
# standard output is a tty
# do interactive initialization
fi
Antwort3
Wenn keine Zeilenbearbeitung erfolgt, bind
sind diese Befehle selbst harmlos. Unterdrücken Sie die Warnungen:
bind '"^[[A":history-search-backward' 2>/dev/null
bind '"^[[B":history-search-forward' 2>/dev/null
Das ist etwas unelegant, sollte aber trotzdem funktionieren. Andere Antworten stimmen nicht überein, was der beste/ausreichende Test ist. Mein Ansatz umgeht dies. Es ist jedoch nicht gut skalierbar. Die beiden Befehle allein sollten keinen großen Unterschied machen; aber wenn Sie mehr hätten, etwa Dutzende, wäre eine richtige Bedingung wahrscheinlich besser.
Antwort4
Ich würde wahrscheinlich einfach testen, ob meine Bash interaktiv ist.
if [[ "$-" = *i* ]]
then
debug "interactive mode"
source ~/.bash_lib/bindings
else
debug "non interactive mode"
fi