¿Cuál es el equivalente bash del comando zsh vared?

5

Vi que con zsh vared puedes editar sobre la marcha la variable de entorno especificada. ¿Hay un comando equivalente para bash ?
Gracias

Carlo
fuente
2
Esto podría funcionar para usted: function vared { tmpfile=$( mktemp -t vared.XXXX ) ; echo "${!1}" > "$tmpfile" ; vim "$tmpfile" && export $1=$( cat "$tmpfile" ) ; rm "$tmpfile" ; }. Llame como vared PATH, por ejemplo , edite el valor vimy guárdelo para cambiar la variable de entorno. ( mktempfunciona de manera diferente según el sistema operativo, esta llamada parece funcionar principalmente según lo previsto en RHEL y OS X).
Daniel Beck
Gracias, es lo suficientemente bueno para mí, aunque no es genial como zsh;) Si desea proporcionarlo como respuesta, lo aceptaré.
Carlo

Respuestas:

6

No estoy al tanto de todo lo que funciona como zsh's vareden bash, fuera de la caja.

Sin embargo, puede definir una función que le permita editar el valor de una variable de entorno utilizando, por ejemplo vim:

function vared {
  [[ $# -eq 1 ]] || { echo "Usage: vared VARNAME" >&2 ; return 1 ; }
  tmpfile=$( command mktemp -t vared.XXXX )
  echo "${!1}" > "$tmpfile"
  command vim "$tmpfile" && export $1="$(< "$tmpfile" )"
  command rm "$tmpfile"
}

Llámalo como vared PATH.

¿Qué hace? Crea un archivo temporal, escribe el valor actual de la variable especificada en el archivo y se abre vimcon el archivo temporal como argumento. Ahora se espera que edite el valor, lo guarde y salga vim(puede salir sin guardar el archivo para omitir los cambios guardados). Luego, el contenido del archivo se establece como el nuevo valor de la variable, todo se exporta y se elimina el archivo temporal. commandes necesario omitir el alias de shell y las búsquedas de funciones, por ejemplo, un rmalias rm -ique preguntar antes de eliminar el archivo al final de lo contrario.

Si la variable no existe o no es una variable de entorno , lo será después.

Daniel Beck
fuente
+1. Yo usaría en $VISUALlugar de codificar vim, y puedes usar en $(< "$tmpfile")lugar de cat - $(<es un bash incorporado
glenn jackman
@glennjackman Gracias por las sugerencias. Eliminé el UUOC. En cuanto a VISUAL: No está configurado de manera predeterminada (al menos en OS X), y verificar si existe y agregar un respaldo (que de todos modos necesitaría ser personalizado) aumentaría innecesariamente la complejidad aquí.
Daniel Beck
0

Esto se basa en la respuesta de thecotne , escrita para GNU Bash 4.3:

vared(){
    # Based on the zsh builtin of the same name.
    IFS= read -rei "${!1}" "$1"
}

Tenga en cuenta que esto tiene algunas diferencias sutiles con respecto al Zsh incorporado, por ejemplo:

  • No se producirá un error si la variable no está establecida
  • Comprueba la validez del nombre de la variable antes de imprimir su valor (p vared $. Ej. )
  • Trunca variables de varias líneas.
wjandrea
fuente