PDA

Ver la versión completa : Otros Lenguajes Como reescribir la variable PS1 de tu prompt en bash script?



Carlos24
17/12/2018, 17:46
Buenas Nos ha tocado un "profe" que no explica teoria ni nada ni te da pdf y te suelta que te busques la vida con las prácticas que pone que la verdad no es ni profe resulta que es su primer año y han metido a uno de ingenieria informática a hacer de profe y nos trata como tal tiene que estar en el bashrc y que no se duplique el PS1=""..

¿Cómo puedo "Decir" que reescriba lo que metas por read al PS1 existente del archivo .bashrc? da por hecho que sabemos bash y casi toda la clase va perdida :confused:

¿Alguna ayuda? mucha información no hay por internet al respecto en bash..

^MiSaTo^
17/12/2018, 17:55
no entiendo exactamente tu pregunta, pero para escribir el valor de una variable en bash es con el comando echo. Si tienes una variable PS1, sería echo $PS1; y con eso debería mostrar el valor.

Carlos24
17/12/2018, 21:01
no entiendo exactamente tu pregunta, pero para escribir el valor de una variable en bash es con el comando echo. Si tienes una variable PS1, sería echo $PS1; y con eso debería mostrar el valor.

perdona si no se me ha entendido Quiere que guardes permanente desde un menu que ya lo tengo creado con un case y sobrescribas la variable PS1 del .bashrc con echo solo muestra por pantalla hasta donde yo se que luego se borra al salirte de la terminal.

swapd0
17/12/2018, 22:10
PS1="lo que sea"

¿no?

Ten en cuenta que hasta que no cierres la terminal y abras una nueva no veras los cambios.

xzhorro
17/12/2018, 22:13
Puedes usar sed
creo que seria algo como esto (estoy un poco oxidado con los metas)
sed 's/PS1=\".*\"/PS1=\"otro valor\"/' .bashrc

Si quieres que cambie lo que pones en ps1 solo tendrías que poner el valor en una variable y meterlo en la cadena.

Carlos24
17/12/2018, 22:23
Sí eso es pero el problema no quiere que se duplique al hacer echo PS1="Lo que sea" a >> .bashrc porque tengo 3 o 4 funciones en una funcion le cambio el hostname , en otra le meto color y cosillas así pero claro si lo hago asi me escribe cada funcion en una linea PS1 diferente .

He leído por ahi que con sed permite reescribir algo existente pero ni idea como va xD.

edit zhorro vale eso creo que se asemeja a lo que quiere el profe pues al lio gracias es que tiene tela que en FP superior de por sentado que se sepa hacer scripts de este tipo sin explicar nada xD.

Carlos24
18/12/2018, 04:26
Conseguido dejo aqui un boceto para si algún día alguien necesite un menú con functions

P.D al final utilice sed -i -e '/PS1=/d' ~/.bashrc el /d sirve para eliminar cualquier PS1= vigente repetido y el ~ para remarcar siempre al directorio home del usuario y salvo que salga del while que le digo para finalizar el script y en caso de tecla erronea mostrar un error no válido.

el exec bash es para hacerme a mi más comodo ver reflejado los cambios sin cerrar la terminal pues no es más que llamar a la terminal bash de nuevo



#!/bin/bash

function menu {
echo "[1] cambiar prompt color"
echo ""
echo "[2] cambiar Hostname"
echo ""
echo "[3] que se vea el PWD"
echo ""
echo "[4] que se vea la hora"
echo ""
echo "[x] Exit"
echo ""

read -p "Opciones > " option (esto es para que salga en pantalla de bajo del menu Opciones o lo que quieras tener escrito en pantalla > y espera a que pulses una opción )

}

function color {
clear
cd

}

function hostname {
clear
cd
#prompt actual = $hostn
hostn=$PS1

#Decir el prompt a la variable hostn
echo "El actual prompt es is $hostn"

#Preguntar por el nuevo hostname host a la variable $newhost
echo "Introduce el nuevo hostname: "
read newhost

#Lectura y escritura para el nuevo prompt hostname
echo "tu nuevo hostname es $newhost"
sed -i -e '/PS1=/d' ~/.bashrc
echo PS1=[$(whoami)\@$newhost] >> ~/.bashrc
exec bash
}

function pwd {
clear
cd

}

function hora {
clear
cd


}

function terminate {
exit
}

end_script=0
while [ "${end_script}" != 1 ];do
menu
case ${option} in

1)
color
;;

2)
hostname
;;

3)
pwd
;;

3)
hora
;;

x)

terminate
;;

*)
clear
echo "Error tecla no valida!"
exec bash
;;
esac
done