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
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top