Manipulación de cuerdas en cáscara de pescado
-
27-10-2019 - |
Pregunta
Deseo escribir un script de shell de pescado para inicializar automáticamente Java_Home a la actual Java-Alternativa configurada.
En Bash se vería así (perdón por el feo Double Dirname)
j=`update-alternatives --query javac | grep Value:`
JAVA_HOME=`dirname ${j#Value:}`
JAVA_HOME=`dirname $JAVA_HOME`
export JAVA_HOME
¿Qué pasa con el pescado?
set j (update-alternatives --query javac | grep Value:)
set JAVA_HOME (dirname ${j#Value:}) <-- this won't work!!
set JAVA_HOME (dirname $JAVA_HOME)
set --export JAVA_HOME
Solución
Intento:
j=$(update-alternatives --query javac | sed -n '/Value: /s///p')
export JAVA_HOME=${j%/*/*}
Pez:
set j (update-alternatives --query javac | sed -n '/Value: /s///p')
set --export JAVA_HOME (dirname (dirname $j))
o
set --export JAVA_HOME (dirname (dirname (update-alternatives --query javac | sed -n '/Value: /s///p')))
Otros consejos
La cáscara de pescado ahora tiene un string
Comando Builtin para la manipulación de cadenas. Esto se agregó en la versión 2.3.0 (mayo de 2016).
Por ejemplo, en este caso, podríamos usar string replace
para eliminar el Value:
subcadena:
set j (update-alternatives --query javac | grep Value: | string replace 'Value: ' '')
set --export JAVA_HOME (dirname (dirname $j))
Hay mucho más que string
puede hacer. Desde el Documentación de comando de cadena:
Synopsis
string length [(-q | --quiet)] [STRING...]
string sub [(-s | --start) START] [(-l | --length) LENGTH] [(-q | --quiet)]
[STRING...]
string split [(-m | --max) MAX] [(-r | --right)] [(-q | --quiet)] SEP
[STRING...]
string join [(-q | --quiet)] SEP [STRING...]
string trim [(-l | --left)] [(-r | --right)] [(-c | --chars CHARS)]
[(-q | --quiet)] [STRING...]
string escape [(-n | --no-quoted)] [STRING...]
string match [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)]
[(-n | --index)] [(-q | --quiet)] [(-v | --invert)] PATTERN [STRING...]
string replace [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)]
[(-q | --quiet)] PATTERN REPLACEMENT [STRING...]
En lugar de SED, podrías hacer uso de EXPR con una regexp, por ejemplo:
$ set a /path/to/some/folder/file.extension
El comando:
$ expr "//$a" : '.*/\([^.]*\)\..*$'
file
Extraiga el archivo Basename sin extensión.
Ver man expr
Cáscara de pescado:
~> set JAVA_HOME (readlink -f /usr/bin/javac | sed "s:/bin/javac::")
~> echo $JAVA_HOME
Salida (ejemplo):
/usr/lib/jvm/java-8-openjdk-amd64
También puedes agregar a ~/.config/fish/config.fish
esta línea:
set JAVA_HOME (readlink -f /usr/bin/javac | sed "s:/bin/javac::")
WBR