한 줄에 여러 Linux 명령 결합 실행


329

배포 작업을 수행하기 위해 여러 Linux 명령을 한 줄로 병합하려고합니다. 예를 들어

cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install

답변:


717

이전 명령이 성공한 경우에만 각 명령을 실행하려면 &&연산자를 사용하여 명령을 결합하십시오 .

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

38
향후 독자 : ||세미콜론 대신 또는 &&마지막 명령이 실패한 경우 다음 명령 만 실행하려는 경우 에도 사용할 수 있습니다 . 이 방법으로 시도하고 실패하면 시도하십시오.
DeVadder

3
흠, 세미콜론이 항상 작동하는 것은 아닙니다. 예를 들어 ls >/dev/null & ; echo $!오류가 발생합니다.
Hi-Angel

1
그리고 백그라운드에서 첫 번째 명령을 실행하고 전경에서 다른 명령을 실행하려면 어떻게해야합니까 tail -f my.log & && ./myscript?
OverrockSTAR

4
@Pareshkumar bash를 사용하면 다음을 수행 할 수 있습니다. { tail -f my.log & } && ./myscript그러나 &&첫 번째 작업이 백그라운드에서 실행되므로 두 작업이 동시에 시작되므로 두 번째 작업은 결과를 알 수 없으므로 여기서는 쓸모가 없습니다. 따라서 다음과 같이 작성할 수도 있습니다.{ tail -f my.log & }; ./myscript
Nikos C.

sudo명령 중 하나를 실행할 수있는 권한이 필요한 경우 어떻게 합니까? 나는을 넣어해야 sudo모든 명령의 beggining 또는 그냥 필요 하나? 해당 명령에 암호를 전달하여 제대로 실행되도록하려면 어떻게해야합니까?
Drubio

46

;를 사용하여 발견했습니다. 명령을 분리하는 것은 포 그라운드에서만 작동합니다. 예 :

cmd1; cmd2; cmd3 & - cmd3백그라운드 에서만 실행 되는 반면, cmd1 && cmd2 && cmd3 &오류가없는 경우 백그라운드에서 전체 체인을 실행합니다.

괄호를 사용하여 무조건 실행을 처리하려면 다음을 해결하십시오.

(cmd1; cmd2; cmd3) & -단계가 실패하더라도 백그라운드에서 일련의 명령을 실행합니다.


1
귀하의 예에서 후행 앰퍼샌드 (&)가 의도적입니까? 그렇다면 무엇을위한 것입니까?
Technophile

5
@Technophile 그것은 배경 명령
Oak Chantosa

1
간단하고 간단하며 직접적인 대답은 StackExchange 웹 사이트를 더 자주 사용하는 것입니다. Dean. 입력 해 주셔서 감사합니다.
CPHPython

10

세미콜론을 사용하여 명령을 분리 할 수 ​​있습니다.

cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install

그게 무슨 소리 야?


3

한 번에 모두 실행하려면 파이프 라인 키 "|"를 사용할 수 있습니다. 이렇게 :

$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install

1
파이프 라인은 명령 출력을 다음 명령에 입력으로 제공하는 데 사용됩니다. 예를 들면 다음과 같습니다. X | Y-> X 명령 출력은 Y 명령의 입력으로 작동합니다
Arpan Saini

2

이전 명령의 실행 여부에 관계없이 모든 명령을 실행하려면 세미콜론 (;)을 사용하여 명령을 분리 할 수 ​​있습니다.

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

귀하의 경우 연속 명령의 실행은 이전 명령에 의존하는 것처럼 보이므로 두 번째 예를 사용하십시오 (예 : &&를 사용하여 명령을 결합하십시오).


1
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

그것은 OP 스크립트와 동일하지 않습니다. 설명하십시오 : aa 명령이 실패하면 스크립트가 중단됩니다
Gilles Quenot

4
또한 0이 아닌 상태를 셸로 반환 한 경우에만 실행 cmd1 || cmd2해야하는 경우 구분 기호 를 사용할 수 있으며 반환 상태에 관계없이 두 명령을 모두 실행하려는 경우 사용할 수 있습니다 . cmd2cmd1cmd1 ; cmd2
Victor Sorokin

그것은, 난 그냥 &&와 명령에 붙여과 연결된한다 @sputnick
마크 스티븐스

3
@MarkStevens 더 나은 구현이지만 명령이 순차적으로 실행되는 것과 동일한 결과를 얻지 못합니다. 이것이 sputnick의 의미라고 생각합니다.
andrux

1

단 하나의 앰퍼샌드의 유틸리티는 무엇입니까? 오늘 아침, XFCE 패널 (Manjaro + XFCE)에서 2 개의 암호 관리자를 동시에 시작하기 위해 런처를 만들었습니다.

sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"

그러나 원하는대로 작동하지 않습니다. IE, 첫 번째 앱은 시작하지만 두 번째 앱은 이전 앱이 닫힐 때만 시작됩니다

그러나 (단 하나의 앰퍼샌드로)

sh -c "keepassx & password-gorilla"

그리고 내가 원하는대로 작동합니다 ...


1
앰퍼샌드는 ;쉼표를 백그라운드에 넣기 전에 셸이 출력을 볼 수 없다는 점을 제외하고 와 비슷한 명령 종료 자로 작동 합니다.
Sergiy Kolodyazhnyy

-1

다음 코드로 사용할 수 있습니다.

cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install

효과가있다...


-1

이런 종류의 질문에 오해의 소지가 많은 답변을 찾았습니다.

이 게시물에서 수정 : 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();
            }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.