
Situación:Es necesario iniciar sesión en varios servidores remotos y algunos de ellos tienen conchas de pescado.
Requisito:El shell predeterminado es bash. Si inicio sesión en un servidor y hay pescado, cambie a Fish Shell; de lo contrario, permanezca en bash.
Probé .bashrc:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Source global definitions
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
# Update Path
export PATH=/sbin:/usr/sbin:/usr/local/sbin:$PATH:$HOME/.bin
# Open fish shell if present, otherwise stick to bash
if hash fish 2>/dev/null; then
# echo "Fish detected, shifting shell"
fish "$@"; exit
fi
Sin embargo, scp no parece funcionar. Cuando intento escanear un archivo, la salida detallada muestra que está atascado aquí.
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending env LC_ADDRESS = en_US.UTF-8
debug1: Sending env LC_IDENTIFICATION = en_US.UTF-8
debug1: Sending env LC_MEASUREMENT = en_US.UTF-8
debug1: Sending env LC_MONETARY = en_US.UTF-8
debug1: Sending env LC_NAME = en_US.UTF-8
debug1: Sending env LC_NUMERIC = en_US.UTF-8
debug1: Sending env LC_PAPER = en_US.UTF-8
debug1: Sending env LC_TELEPHONE = en_US.UTF-8
debug1: Sending env LC_TIME = en_US.UTF-8
debug1: Sending command: scp -v -f test_file
Inicialmente pensé que el echo
comando hacía que no funcionara, pero tampoco funciona sin él.
Respuesta1
Para salir del bashrc
archivo cuando la sesión de shell que lo genera no es interactiva, puede hacer lo siguiente en la parte superior (o en una ubicación conveniente) del archivo:
case "$-" in
*i*) ;;
*) return ;;
esac
El valor en $-
es una cadena de letras que denota las opciones de shell actualmente configuradas. Si el i
carácter está presente en la cadena, entonces el shell es interactivo.
Esto puede ser necesario ya que, como terdon señaló en los comentarios, Bash trata las sesiones de shell iniciadas por sshd
, el demonio SSH, como un caso especial.
Detalles:¿Por qué bashrc comprueba si el shell actual es interactivo?
Más abajo en el archivo, puede verificar si el fish
shell está disponible e iniciarlo:
if command -v fish 2>/dev/null; then
exec fish
fi
Tenga en cuenta que fish
puede ser el juego "Go Fish" en algunos sistemas :-)
Sobre el uso de command -v
:¿Por qué no utilizar "cuál"? ¿Qué usar entonces?