";"을 사용하여 두 개의 별칭을 호출할 수 없는 이유는 무엇입니까?

";"을 사용하여 두 개의 별칭을 호출할 수 없는 이유는 무엇입니까?

;문자 (예 : )를 사용하여 ls; cd두 개의 일반 명령을 결합 하려고 하면 잘 작동합니다. 그러나 두 개의 별칭( stopdev및 ) 을 만들었고 startdev이를 결합하려고 하면 다음과 같습니다.

stopdev; startdev

또는 다음 뒤에 세미콜론을 추가하려고 해도 다음과 같습니다.

stopdev;

구문 오류가 발생합니다.

bash: 예상치 못한 표시 ";" 근처에 구문 오류가 있습니다.

다음을 사용하면 동일한 문제가 발생합니다 &&.

stopdev && startdev

bash: 예상치 못한 마커 "&&" 근처에 구문 오류가 있습니다.

나는 별칭이 다른 명령과 똑같다고 생각했기 때문에 이것에 대해 혼란스러워요. 그러나 분명히 그렇지 않습니다.

따라서 두 가지 질문이 있습니다.

  1. ;별칭을 사용하여 호출하는 것이 왜 &&유효하지 않습니까?
  2. 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때문에 좋지 않습니다 . 이는 아마도 바람직하지 않을 것입니다.stopdevmake 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
}

관련 정보