Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

323
Visualizações
Función de finalización de Bash en varios sistemas operativos: problema con @ al completar hosts

Estoy escribiendo una función que imita la finalización del host del comando ssh ; la principal diferencia es que utiliza los hosts del dominio xyz.com que se encuentra en ~/.ssh/known_hosts para la finalización.

Aquí está la función:

 _xyzssh() { COMPREPLY=() local arg="${COMP_WORDS[COMP_CWORD]}" [[ $arg != -* ]] || return 0 [ -f ~/.ssh/known_hosts ] || return 0 local -a known_hosts read -d '' -a known_hosts < <(awk '{ n = split($1,arr,","); for (i = 1; i <= n; i++) if (arr[i] ~ /\.xyz\.com$/) print arr[i] }' ~/.ssh/known_hosts) if [[ $arg == *@* ]] then known_hosts=( ${known_hosts[@]/#/${arg%%@*}@} ) fi COMPREPLY=( $(compgen -W "${known_hosts[*]}" -- $arg) ) return 0 } complete -F _xyzssh xyzssh

Este código funciona bien en Linux (bash 4.2) pero tiene un comportamiento extraño en macOS (bash 3.2). Por ejemplo, cuando escribo:

xyzssh -X user@server servidor

  • En Linux se completa con: xyzssh -X user@server.xyz.com

  • En macOS, "dobla" el nombre de usuario: xyzssh -X useruser@server.xyz.com

Supongo que hay algo sospechoso con el @ porque cuando escribo:

xyzssh -X user\@server servidor

Se completa correctamente tanto en Linux como en macOS.

¿Hay alguna forma de corregir este comportamiento en macOS? arreglado: vea la respuesta aceptada a continuación


Actualizar

Acabo de enterarme de COMP_WORDBREAKS , que contiene @ en macOS mientras que en Linux no.

Puedo solucionar el problema cuando configuro COMP_WORDBREAKS="${COMP_WORDBREAKS//@}" en el shell, pero hacer que el cambio sea resistente no es tan fácil en macOS (exportar esta configuración en mi .bash_profile o .bashrc no parece trabaja)...


Actualizar

Tengo otros problemas, esta vez con Solaris (bash 4.4), en los que ${COMP_WORDS[COMP_CWORD]} ni siquiera contiene la parte user@ cuando se llama a la función de finalización... Todavía estoy investigando cómo solucionarlo . arreglado: vea la respuesta aceptada a continuación


Es la primera vez que escribo una función de finalización, por lo que es posible que me esté perdiendo algo obvio.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Tomando el camino de responder a mi propia pregunta

COMPREPLY debe completarse de manera diferente según la presencia de @ en COMP_WORDBREAKS .

Por ejemplo, cuando el usuario escribe ssh user@server Tab :

  • si @ no está en COMP_WORDBREAKS entonces COMPREPLY debería verse así:
 COMPREPLY=( "user@server.xyz.com" "user@server-bis.xyz.com" )
  • si @ está en COMP_WORDBREAKS entonces COMPREPLY debería verse así:
 COMPREPLY=( "@server.xyz.com" "@server-bis.xyz.com" )

Una solución para hacer que la función de finalización sea compatible con ambos casos es agregar el prefijo correcto después de encontrar la lista de hosts coincidentes:

Actualización: problema fijo de Solaris bash 4.4

 _xyzssh() { COMPREPLY=() local curr="${COMP_WORDS[COMP_CWORD]}" local prev="${COMP_WORDS[COMP_CWORD-1]}" [[ $curr == -* ]] && return 0 [ -f ~/.ssh/known_hosts ] || return 0 local -a known_hosts IFS=$'\n' read -r -d '' -a known_hosts < <(awk '{ n = split($1,arr,","); for (i = 1; i <= n; i++) if (arr[i] ~ /\.xyz\.com$/) print arr[i] }' ~/.ssh/known_hosts) COMPREPLY=( $(compgen -W "${known_hosts[*]}" -- "${curr#*@}") ) if [[ $curr == *@* || $prev == @ ]] then if [[ $COMP_WORDBREAKS == *@* ]] then COMPREPLY=( "${COMPREPLY[@]/#/@}" ) else COMPREPLY=( "${COMPREPLY[@]/#/${curr%%@*}@}" ) fi fi return 0 } complete -F _xyzssh xyzssh

Información de depuración

Esto es lo que obtengo en COMP_WORDS cuando escribo xyzssh -X user@server Tab en los diferentes sistemas operativos:

  • redhat 7 (bash 4.2, @ no presente en COMP_WORDBREAKS )
 COMP_WORDS=( "xyzssh" "-X" "user@server" )
  • macOS (bash 3.2, @ presente en COMP_WORDBREAKS )
 COMP_WORDS=( "xyzssh" "-X" "user@server" )
  • solaris 11.4 (bash 4.4, @ presente en COMP_WORDBREAKS )
 COMP_WORDS=( "xyzssh" "-X" "user" "@" "server" )
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda