script - Ejecutar combinar varios comandos de linux en una línea
scripts bash ejemplos (9)
¿Cuál es la utilidad de un único Ampersand? Esta mañana, hice un lanzador en el panel XFCE (en Manjaro + XFCE) para lanzar 2 administradores de contraseñas simultáneamente:
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
Pero no funciona como yo quiero. IE, la primera aplicación se inicia pero la segunda solo se inicia cuando se cierra la anterior: - /
Sin embargo, encontré que (con solo un signo):
sh -c "keepassx & password-gorilla"
y funciona como quiero ahora ...
Estoy intentando fusionar varios comandos de Linux en una línea para realizar la operación de implementación. Por ejemplo
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Encuentro muchas respuestas para este tipo de pregunta engañosa
Modificado de esta publicación: https://www.webmasterworld.com/linux/3613813.htm
El siguiente código creará una ventana bash y funciona exactamente como una ventana bash. Espero que esto ayude. Demasiadas respuestas incorrectas / que no funcionan por ahí ...
Process proc;
try {
//create a bash window
proc = Runtime.getRuntime().exec("/bin/bash");
if (proc != null) {
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
BufferedReader err = new BufferedReader(new InputStreamReader(
proc.getErrorStream()));
//input into the bash window
out.println("cd /my_folder");
out.println("rm *.jar");
out.println("svn co path to repo");
out.println("mvn compile package install");
out.println("exit");
String line;
System.out.println("----printing output-----");
while ((line = in.readLine()) != null) {
System.out.println(line);
}
while((line = err.readLine()) != null) {
//read errors
}
proc.waitFor();
in.close();
out.close();
err.close();
proc.destroy();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
He encontrado que utilizando; Separar comandos solo funciona en primer plano. p.ej :
cmd1; cmd2; cmd3 &
cmd1; cmd2; cmd3 &
- solo ejecutará cmd3
en segundo plano, mientras que cmd1 && cmd2 && cmd3 &
- ejecutará toda la cadena en segundo plano SI no hay errores.
Para atender la ejecución incondicional, el uso de paréntesis resuelve esto:
(cmd1; cmd2; cmd3) &
- ejecutará la cadena de comandos en segundo plano, incluso si falla algún paso.
Para ejecutarlos todos a la vez, puede usar la tecla de línea de tubería "|" al igual que:
$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install
Puedes separar tus comandos usando un punto y coma:
cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install
¿Eso es lo que quieres decir?
Se puede utilizar como el siguiente código;
cd /my_folder && /
rm *.jar && /
svn co path to repo && /
mvn compile package install
Funciona...
Si desea ejecutar cada comando solo si el anterior tuvo éxito, combínelos utilizando el operador &&
:
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Si uno de los comandos falla, todos los demás comandos que lo siguen no se ejecutarán.
Si desea ejecutar todos los comandos sin importar si los anteriores fallaron o no, sepárelos con punto y coma:
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
En su caso, creo que quiere el primer caso donde la ejecución del siguiente comando depende del éxito del anterior.
También puedes poner todos los comandos en un script y ejecutar eso en su lugar:
#! /bin/sh
cd /my_folder /
&& rm *.jar /
&& svn co path to repo /
&& mvn compile package install
(Las barras invertidas al final de la línea están ahí para evitar que el shell piense que la siguiente línea es un comando nuevo; si omite las barras invertidas, deberá escribir todo el comando en una sola línea).
Guarda eso en un archivo, por ejemplo, myscript
, y myscript
ejecutable:
chmod +x myscript
Ahora puede ejecutar ese script como otros programas en la máquina. Pero si no lo coloca dentro de un directorio listado en su PATH
entorno PATH
(por ejemplo /usr/local/bin
, o en algunas distribuciones de Linux ~/bin
), deberá especificar la ruta de acceso a ese script. Si está en el directorio actual, ejecutarlo con:
./myscript
Los comandos en el script funcionan de la misma manera que los comandos en el primer ejemplo; el siguiente comando solo se ejecuta si el anterior tuvo éxito. Para la ejecución incondicional de todos los comandos, simplemente liste cada comando en su propia línea:
#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Si desea ejecutar todos los comandos, ya sea que se ejecute el anterior, puede usar el punto y coma (;) para separar los comandos.
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
Si desea ejecutar el siguiente comando solo si el comando anterior tiene éxito, puede usar && para separar los comandos.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
En su caso, la ejecución de comandos consecutivos parece depender de los comandos anteriores, así que use el segundo ejemplo, es decir, use && para unir los comandos.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install