답변:
이전 명령이 성공한 경우에만 각 명령을 실행하려면 &&
연산자를 사용하여 명령을 결합하십시오 .
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
명령 중 하나가 실패하면 그 뒤에 오는 다른 모든 명령이 실행되지 않습니다.
이전 명령의 실패 여부에 관계없이 모든 명령을 실행하려면 세미콜론으로 구분하십시오.
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
귀하의 경우 다음 명령의 실행이 이전 명령의 성공에 달려있는 첫 번째 경우를 원한다고 생각합니다.
모든 명령을 스크립트에 넣고 대신 실행할 수도 있습니다.
#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
(라인 끝에있는 백 슬래시는 쉘이 다음 라인이 새로운 명령이라고 생각하지 않도록하기 위해 존재합니다. 백 슬래시를 생략하면 전체 명령을 한 라인에 작성해야합니다.)
파일을 예를 들어 파일에 저장 myscript
하고 실행 파일로 만드십시오.
chmod +x myscript
이제 컴퓨터의 다른 프로그램과 마찬가지로 해당 스크립트를 실행할 수 있습니다. 그러나 PATH
환경 변수에 나열된 디렉토리 (예 /usr/local/bin
: 일부 Linux 배포판 ~/bin
) 에 디렉토리를 배치하지 않으면 해당 스크립트의 경로를 지정해야합니다. 현재 디렉토리에 있으면 다음을 사용하여 실행하십시오.
./myscript
스크립트의 명령은 첫 번째 예의 명령과 동일한 방식으로 작동합니다. 다음 명령은 이전 명령이 성공한 경우에만 실행됩니다. 모든 명령을 무조건 실행하려면 각 명령을 해당 행에 나열하십시오.
#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
ls >/dev/null & ; echo $!
오류가 발생합니다.
tail -f my.log & && ./myscript
?
{ tail -f my.log & } && ./myscript
그러나 &&
첫 번째 작업이 백그라운드에서 실행되므로 두 작업이 동시에 시작되므로 두 번째 작업은 결과를 알 수 없으므로 여기서는 쓸모가 없습니다. 따라서 다음과 같이 작성할 수도 있습니다.{ tail -f my.log & }; ./myscript
sudo
명령 중 하나를 실행할 수있는 권한이 필요한 경우 어떻게 합니까? 나는을 넣어해야 sudo
모든 명령의 beggining 또는 그냥 필요 하나? 해당 명령에 암호를 전달하여 제대로 실행되도록하려면 어떻게해야합니까?
;를 사용하여 발견했습니다. 명령을 분리하는 것은 포 그라운드에서만 작동합니다. 예 :
cmd1; cmd2; cmd3 &
- cmd3
백그라운드 에서만 실행 되는 반면,
cmd1 && cmd2 && cmd3 &
오류가없는 경우 백그라운드에서 전체 체인을 실행합니다.
괄호를 사용하여 무조건 실행을 처리하려면 다음을 해결하십시오.
(cmd1; cmd2; cmd3) &
-단계가 실패하더라도 백그라운드에서 일련의 명령을 실행합니다.
한 번에 모두 실행하려면 파이프 라인 키 "|"를 사용할 수 있습니다. 이렇게 :
$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install
이전 명령의 실행 여부에 관계없이 모든 명령을 실행하려면 세미콜론 (;)을 사용하여 명령을 분리 할 수 있습니다.
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
이전 명령이 성공한 경우에만 다음 명령을 실행하려면 &&를 사용하여 명령을 분리 할 수 있습니다.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
귀하의 경우 연속 명령의 실행은 이전 명령에 의존하는 것처럼 보이므로 두 번째 예를 사용하십시오 (예 : &&를 사용하여 명령을 결합하십시오).
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
cmd1 || cmd2
해야하는 경우 구분 기호 를 사용할 수 있으며 반환 상태에 관계없이 두 명령을 모두 실행하려는 경우 사용할 수 있습니다 . cmd2
cmd1
cmd1 ; cmd2
단 하나의 앰퍼샌드의 유틸리티는 무엇입니까? 오늘 아침, XFCE 패널 (Manjaro + XFCE)에서 2 개의 암호 관리자를 동시에 시작하기 위해 런처를 만들었습니다.
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
그러나 원하는대로 작동하지 않습니다. IE, 첫 번째 앱은 시작하지만 두 번째 앱은 이전 앱이 닫힐 때만 시작됩니다
그러나 (단 하나의 앰퍼샌드로)
sh -c "keepassx & password-gorilla"
그리고 내가 원하는대로 작동합니다 ...
;
쉼표를 백그라운드에 넣기 전에 셸이 출력을 볼 수 없다는 점을 제외하고 와 비슷한 명령 종료 자로 작동 합니다.
이런 종류의 질문에 오해의 소지가 많은 답변을 찾았습니다.
이 게시물에서 수정 : https://www.webmasterworld.com/linux/3613813.htm
다음 코드는 bash 창을 만들고 bash 창과 정확하게 작동합니다. 도움이 되었기를 바랍니다. 너무 많은 잘못되거나 작동하지 않는 답변이 있습니다 ...
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();
}
||
세미콜론 대신 또는&&
마지막 명령이 실패한 경우 다음 명령 만 실행하려는 경우 에도 사용할 수 있습니다 . 이 방법으로 시도하고 실패하면 시도하십시오.