Solución 1:
Intenta hacer esto en su lugar
if [ "$SSH_TTY" ]
then
source .bashc_real
fi
Solución 2:
La respuesta de Mike probablemente funcionará. Pero vale la pena señalar que puede lograr esto seleccionando cuidadosamente en qué archivos de inicio colocar las cosas detalladas. Desde la página de manual de bash:
Cuando se invoca bash como un shell de inicio de sesión interactivo, o como un shell no interactivo con la opción --login, primero lee y ejecuta comandos desde el archivo /etc/profile, si ese archivo existe. Después de leer ese archivo, busca ~/.bash_profile, ~/.bash_login y ~/.profile, en ese orden, y lee y ejecuta comandos desde el primero que existe y es legible. La opción --noprofile se puede usar cuando se inicia el shell para inhibir este comportamiento.
Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, bash lee y ejecuta comandos desde ~/.bashrc, si ese archivo existe. Esto se puede inhibir usando la opción --norc. La opción de archivo --rcfile forzará a bash a leer y ejecutar comandos desde el archivo en lugar de ~/.bashrc.
Las herramientas sftp/scp inician un shell interactivo sin inicio de sesión, por lo que se obtendrá .bashrc. Muchas distribuciones obtienen .bashrc de .bash_profile o viceversa, por lo que puede resultar confuso. Un buen truco para probar la limpieza de su entorno de inicio de sesión es hacer ssh con un comando, que simula la misma forma en que se conecta scp/sftp. Por ejemplo:ssh myhost /bin/true
le mostrará exactamente lo que ve scp/sftp cuando se conectan.
Una demostración sencilla:
[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$
La primera prueba hará que se rompa scp/sftp/rsync, etc. La segunda versión funcionará bien.
Solución 3:
Si está utilizando csh:
if ($?prompt)
... interactive stuff ...
Y si es bash:
if [[ $- == *i* ]]; then
... interactive stuff ...
fi
o alternativamente usando expresiones regulares de bash:
if [[ $- =~ i ]]; then
... interactive stuff ...
fi
Estas líneas deben preceder a las líneas en las que emites o repites algo.