Lösung 1:
Versuchen Sie stattdessen, dies zu tun
if [ "$SSH_TTY" ]
then
source .bashc_real
fi
Lösung 2:
Mikes Antwort wird wahrscheinlich funktionieren. Aber es ist erwähnenswert, dass Sie dies erreichen können, indem Sie sorgfältig auswählen, in welche Startdateien Sie das ausführliche Zeug einfügen. Von der Bash-Manpage:
Wenn bash als interaktive Login-Shell oder als nicht-interaktive Shell mit der Option --login aufgerufen wird, liest es zuerst Befehle aus der Datei /etc/profile und führt sie aus, falls diese Datei existiert. Nach dem Lesen dieser Datei sucht es in dieser Reihenfolge nach ~/.bash_profile, ~/.bash_login und ~/.profile und liest und führt Befehle von der ersten Datei aus, die existiert und lesbar ist. Die Option --noprofile kann verwendet werden, wenn die Shell gestartet wird, um dieses Verhalten zu verhindern.
Wenn eine interaktive Shell gestartet wird, die keine Login-Shell ist, führt bash readsand Befehle aus ~/.bashrc aus, falls diese Datei existiert. Dies kann mit der Option --norc unterbunden werden. Die Dateioption --rcfile zwingt Bash dazu, Befehle aus der Datei statt aus ~/.bashrc.
zu lesen und auszuführen
Die sftp/scp-Tools starten eine interaktive Non-Login-Shell, sodass .bashrc bezogen wird. Viele Distributionen beziehen .bashrc von .bash_profile oder umgekehrt, sodass es verwirrend werden kann. Ein guter Trick, um die Sauberkeit Ihrer Anmeldeumgebung zu testen, besteht darin, sich mit einem Befehl über ssh einzuloggen, der die gleiche Art und Weise simuliert, wie scp/sftp eine Verbindung herstellt. Beispiel:ssh myhost /bin/true
zeigt Ihnen genau, was scp/sftp sieht, wenn sie sich verbinden.
Eine einfache Demo:
[email protected]:~$ echo "echo Hello from .profile" > .profile
[email protected]:~$ echo "echo Hello from .bashrc" > .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
Hello from .bashrc
sazerac:~ insyte$
[email protected]:~$ rm .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
sazerac:~ insyte$
Der erste Test führt dazu, dass scp/sftp/rsync usw. brechen. Die zweite Version wird gut funktionieren.
Lösung 3:
Wenn Sie csh verwenden:
if ($?prompt)
... interactive stuff ...
Und wenn es Bash ist:
if [[ $- == *i* ]]; then
... interactive stuff ...
fi
oder alternativ mit regulären Bash-Ausdrücken:
if [[ $- =~ i ]]; then
... interactive stuff ...
fi
Diese Zeilen sollten Zeilen vorausgehen, in denen Sie etwas ausgeben/echo zurückgeben.