;
문자 (예 : )를 사용하여 ls; cd
두 개의 일반 명령을 결합 하려고 하면 잘 작동합니다. 그러나 두 개의 별칭( stopdev
및 ) 을 만들었고 startdev
이를 결합하려고 하면 다음과 같습니다.
stopdev; startdev
또는 다음 뒤에 세미콜론을 추가하려고 해도 다음과 같습니다.
stopdev;
구문 오류가 발생합니다.
bash: 예상치 못한 표시 ";" 근처에 구문 오류가 있습니다.
다음을 사용하면 동일한 문제가 발생합니다 &&
.
stopdev && startdev
bash: 예상치 못한 마커 "&&" 근처에 구문 오류가 있습니다.
나는 별칭이 다른 명령과 똑같다고 생각했기 때문에 이것에 대해 혼란스러워요. 그러나 분명히 그렇지 않습니다.
따라서 두 가지 질문이 있습니다.
;
별칭을 사용하여 호출하는 것이 왜&&
유효하지 않습니까?stopstartdev
두 명령을 동시에 쉽게 실행할 수 있는 방법(별칭을 만드는 것 외에)이 있습니까 ?
이는 다음의 정의입니다 stopdev
.
alias stopdev="cd $HOME/website; make website_stop; make backend_stop;"
답변1
간단히 별칭을 해당 정의로 대체하여 별칭을 확장합니다(문자열이 아닌 토큰 목록으로, 이는 기본적으로 문자열을 가져와 끝에 공백을 추가하는 것과 동일함). 그래서 stopdev; true
그것은 다음으로 확장됩니다.
cd $HOME/website; make website_stop; make backend_stop; ; true
^^^
쉘 구문에는 두 개의 연속 세미콜론을 사용할 수 없으므로 이는 구문 오류입니다.
를 제거 ;
하면 작동할 수 있지만 전달하는 모든 인수가 에 전달되기 stopdev; startev
때문에 좋지 않습니다 . 이는 아마도 바람직하지 않을 것입니다.stopdev
make backend_stop
함수로 바꿔야 합니다. 또한 make
실패할 경우 명령을 실행하지 마십시오 cd
.
stopdev () {
cd "$HOME/website" && {
make website_stop
make backend_stop
}
}
개선점은 make website_stop
실패했지만 성공하더라도 함수가 make backend_stop
실패 코드를 반환 하도록 하는 것입니다.
stopdev () {
cd "$HOME/website" && {
make website_stop
ret=$?
make backend_stop && return $ret
}
}
~/website
이렇게 하면 디렉토리 에 그대로 남게 됩니다 . 쉘 프로세스의 디렉토리를 변경하지 않으려면 서브쉘에서 함수를 실행하십시오.
stopdev () (
cd "$HOME/website" && {
make website_stop
ret=$?
make backend_stop && return $ret
}
)
또는 GNU make를 통해 해당 -C
옵션을 사용할 수 있습니다.
stopdev () {
make -C "$HOME/website" website_stop
ret=$?
make -C "$HOME/website" backend_stop && return $ret
}
목표가 절대 실패할 수 없다면 둘 다 통과하세요.
stopdev () (
cd "$HOME/website" && make website_stop backend_stop
)
또는
stopdev () {
make -C "$HOME/website" website_stop backend_stop
}