Execute combine multiple Linux commands in one line
LinuxCommand LineLinux Problem Overview
I am trying to merge multiple linux commands in one line to perform deployment operation. For example
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Linux Solutions
Solution 1 - Linux
If you want to execute each command only if the previous one succeeded, then combine them using the &&
operator:
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
If one of the commands fails, then all other commands following it won't be executed.
If you want to execute all commands regardless of whether the previous ones failed or not, separate them with semicolons:
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
In your case, I think you want the first case where execution of the next command depends on the success of the previous one.
You can also put all commands in a script and execute that instead:
#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
The backslashes at the end of the line are there to prevent the shell from thinking that the next line is a new command; if you omit the backslashes, you would need to write the whole command in a single line.
A more convenient way compared to using backslashes and &&
everywhere is to instruct the shell to exit the script if any of the commands fail. You do that using the set
built-in function with the -e
argument. With that, you can write a script in a much more natural way:
#! /bin/sh
set -e
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Save that to a file, for example myscript
, and make it executable:
chmod +x myscript
You can now execute that script like other programs on the machine. But if you don't place it inside a directory listed in your PATH
environment variable (for example /usr/local/bin
, or on some Linux distributions ~/bin
), then you will need to specify the path to that script. If it's in the current directory, you execute it with:
./myscript
The commands in the script work the same way as the commands in the first example; the next command only executes if the previous one succeeded. For unconditional execution of all commands, simply don't call set -e
:
#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Solution 2 - Linux
I've found that using ; to separate commands only works in the foreground. eg :
cmd1; cmd2; cmd3 &
- will only execute cmd3
in the background, whereas
cmd1 && cmd2 && cmd3 &
- will execute the entire chain in the background IF there are no errors.
To cater for unconditional execution, using parenthesis solves this :
(cmd1; cmd2; cmd3) &
- will execute the chain of commands in the background, even if any step fails.
Solution 3 - Linux
You can separate your commands using a semi colon:
cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install
Was that what you mean?
Solution 4 - Linux
To run them all at once, you can use the pipe line key "|" like so:
$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install
Solution 5 - Linux
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Solution 6 - Linux
If you want to execute all the commands, whether the previous one executes or not, you can use semicolon (;) to separate the commands.
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
If you want to execute the next command only if the previous command succeeds, then you can use && to separate the commands.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
In your case, the execution of consecutive commands seems to depend upon the previous commands, so use the second example i.e. use && to join the commands.
Solution 7 - Linux
What is the utility of an only one Ampersand? This morning, I made a launcher in the XFCE panel (in Manjaro+XFCE) to launch 2 passwords managers simultaneously:
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
But it does not work as I want. I.E., the first app starts but the second starts only when the previous is closed
However, I found that (with only one ampersand):
sh -c "keepassx & password-gorilla"
and it works as I want now...
Solution 8 - Linux
- Use
;
- No matter the first command cmd1 run successfully or not, always run the second command cmd2:
$ cd myfolder; ls # no matter cd to myfolder successfully, run ls
- Use
&&
-
Only when the first command cmd1 run successfully, run the second command cmd2:
$ cd myfolder && ls # run ls only after cd to myfolder
- Use
||
-
Only when the first command cmd1 failed to run, run the second command cmd2:
$ cd myfolder || ls # if failed cd to myfolder, `ls` will run
Solution 9 - Linux
You can use as the following code;
cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install
It works...
Solution 10 - Linux
I find lots of answer for this kind of question misleading
Modified from this post: https://www.webmasterworld.com/linux/3613813.htm
The following code will create bash window and works exactly as a bash window. Hope this helps. Too many wrong/not-working answers out there...
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();
}
Solution 11 - Linux
FYI, if you need to run multiple commands in one-line in if-else, you can group the commands with parenthesis. See this page for more details.
You can replace the semicolon (;) with && or || depending on what you need. Please note that parenthesis creates a sub-shell to execute the commands.
Following command executes the cmd1, cmd2, and cmd3 commands if a file called file_name exists; otherwise, cmd4, cmd5, and cmd6.
[ -f file_name ] && (cmd1; cmd2; cmd3) || (cmd4; cmd5; cmd6)