CLI 환경에서 명령어를 입력할 때, 보통은 한 명령어의 실행이 끝나고 나서야 다음 명령어를 입력해서 실행시킨다.
하지만 현재 명령어의 다음 명령어가 정해져 있거나, 여러 명령어를 동시에 실행하고 싶을 때가 있다.
(실행시켜 놓고 자고 싶을 때..)
사실 나도 실행을 해놓고 나가야할 일이 생겨서 이런 방법이 있는지 찾아본 것인데,
다행히도 CLI 환경에서는 여러 명령어를 한 줄에 적어 순차적으로 실행시킬 수 있는 방법이 존재했다!(아싸ㅎㅎ)
리눅스에서 여러개의 명령어를 순차적으로 실행시키고자 할 때에는 구분자를 사용한다.
여러가지 구분자들이 있는데, 각 구분자들은 현재 실행된 명령어의 성공여부에 따라 다른 동작을 하기도 하며, 앞의 실행결과를 뒤의 명령어의 실행의 데이터로 사용하는 경우도 있다. 아래에서 어떤 종류가 있는지 확인해 보고 각 구분자의 특징들을 짚어보자.
세미콜론으로 각 명령어를 구분하면, 단순하게 하나의 명령어 라인에서 여러개의 명령어를 실행한다.
따라서 이전 명령어의 성공여부는 중요하지 않고, 단순히 앞의 명령어부터 순차적으로 실행을 한다.
mkdir text;cd text
위의 명령어를 실행하면 text라는 폴더를 만들고 text폴더로 경로를 변경하는 작업을 순차적으로 실행하게 된다.

세미 콜론의 경우 이전 명령어가 성공했는지를 신경쓰지 않기 때문에,
위의 코드도 text 폴더가 만들어졌든 안 만들어졌든 cd text가 실행될 것이니 만약 text 폴더가 성공적으로 만들어지지 않았다면 오류를 내뿜을 것이다.
(사실 위의 코드는 이전 실행 결과가 뒤 실행 결과에 영향을 주기 때문에 세미콜론이 아닌 다른 구분자를 사용해야한다.)
앰퍼센드로 명령어를 구분하게 되면, 앞의 명령어는 백그라운드로 실행하고, 즉시 뒤의 명령어를 실행한다.
따라서 앞의 명령어가 백그라운드에서 실행되므로 뒤의 명령어는 앞쪽 명령어의 실행의 완료 여부에 상관없이 실행된다.
python train.py --model model_1 & python train.py --model model_2
앰퍼센트(&)는 단순히 생각하면 동시에 여러개의 명령어를 실행하는 것과 같다.
따라서 앞서 말한대로 한 줄에 적는 명령어들이 서로 선후관계가 없고 동시에 실행해도 괜찮은 경우에 사용하는 것이 좋다.
위의 예제는 서로 다른 모델로 학습을 하는 것을 하나는 백그라운드에서 실행하고 즉시 뒤에 다른 모델로도 학습하는 것을 말한다. 즉 2개의 실험을 동시에 하는 것으로 이해하면 될 것 같다.
앞의 명령어의 실행결과를 뒤의 명령어의 입력으로 넘기는 기능을 한다. 파이프(Pipe)라고 많이 불리며, grep명령어와 묶어서 많이 사용한다.
ls -al | grep test

위의 명령어는 ls명령어를 통해서 모든 파일들의 목록을 표시하고, grep명령어를 통해서 그 목록들 중에 test라는 문자열이 포함된 라인만 출력해주는 것이다. 이와 같이 뒤의 명령어에 앞의 명령어의 결과를 파이프를 통해 손쉽게 전달할 수 있다.
더블 앰퍼샌드로 명령어를 연결하게 되면, 앞에 있는 명령어가 실패하면 뒤에 있는 명령어를 실행하지 않는다.
sudo apt-get update && sudo apt-get upgrade -y
apt-get명령어는 패키지의 설치와 삭제 업데이트 등을 관리할 수 있는 명령어이다. 따라서 앞의 명령어는 apt-get update로 패키지 업데이트의 목록을 불러오는 것이고, 뒤의 apt-get upgrade 명령어는 목록을 통하여 업데이트를 실제로 진행하는 것이다. 따라서 앞의 update가 실패할 경우 뒤의 명령어가 실행되면 의미가 없다. 즉 앞의 명령어의 성공여부가 뒤의 명령어를 실행할 때 영향이 크다면 더블 앰퍼샌드를 사용하여 연결해주면 굉장히 유용하다.
더블 버티컬바로 명령어를 연결하게 되면, 앞에 있는 명령어가 성공하면 뒤에 있는 명령어를 실행하지 않는다.
rmdir test || sudo rmdir test
위와 같은 경우 사용할 수 있다. 만약에 앞의 명령어가 실행이 되면 뒤의 명령어는 필요하지 않을 경우이다. 위의 예시는 앞에서는 관리자 권한이 없이 test라는 폴더를 삭제한다. 이 명령어가 실패한다면, test라는 폴더를 sudo를 통해여 관리자 권한으로 삭제시켜 주는 것이다. 따라서 앞의 명령어가 성공하지 못하면 뒤의 명령어가 실행되야 하는 경우에 사용하면 유용하다.