Tonin señaló un error en mi mensaje predeterminado . Ejemplo mínimo:
Establecer PS1:
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '
En este punto, el indicador se ve así:
$
Ahora active la salida del código de salida ejecutando:
false
Ahora el mensaje contiene el código de salida en rojo al comienzo de la línea:
1 $
- Presione Ctrl- r.
Escriba "falso". Ahora el mensaje contiene solo la búsqueda:
(reverse-i-search)`false': false
- Presione Enter.
El historial del terminal resultante ahora contiene lo siguiente:
1 $ch)`false': false
Rendimiento esperado:
1 $ false
Es decir, parece que el resultado de la búsqueda del historial se mezcla con la solicitud y oculta el comando real que se ejecutó.
Intenté solucionar esto usandoPROMPT_COMMAND
:
set_exit_code() {
exit_code=$?
[[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " "
}
set_bash_prompt() {
PS1='$(set_exit_code)$ ' # Double quotes give the same result
}
PROMPT_COMMAND=set_bash_prompt
Esto no parece funcionar: la línea se ve exactamente igual que antes después de buscar y ejecutar.
¿Cómo puedo arreglar esto?
Respuestas:
Encontré la respuesta en askubuntu.com . @ qeirha mencionó que tiene que decirle a bash que la secuencia de caracteres no debe contarse en la longitud de la solicitud, y lo hace al encerrarla
\[
\]
. Según el ejemplo proporcionado, aquí hay una solución:fuente
PS1
código, ¿por qué no vi ese?(Lo sentimos, no hay explicación aquí. Consulte ¿Cómo personalizar la PS1 correctamente? O cualquier otra pregunta sobre problemas de cálculo de la longitud del indicador y
\[
...\]
)fuente
\[...\]
funciona bien siempre que pueda poner todo el código que desea generar su solicitud en una sola cadena. Sin embargo, si desea dividir su código en pequeñas funciones, llega a un punto en el que no puede colocar los corchetes iniciales y finales en la misma cadena / función. Y eso rompe la línea de envoltura. A menos que recurra al usoPROMPT_COMMAND
para volver a calcular suPS1
en cada solicitud.Ampliando la respuesta @manatwork pero manteniendo su código dividiendo el
PS1
cálculo en diferentes funciones, puede escribir su mensaje de la siguiente manera:Las comillas dobles son obligatorias tanto cuando se configura
PS1
como cuando se usaprintf
en la función.fuente
.bashrc
- no ponga el código en un archivo separado y llame a eso.