&&는 백그라운드 스크립트에서 &와 함께 사용할 수 없습니다.

&&는 백그라운드 스크립트에서 &와 함께 사용할 수 없습니다.

이 스크립트가 있습니다.

cd foo && git pull && node server.js & && pid=$! && echo "$pid"

하지만 bash는 이 부분을 좋아하지 않는 것 같습니다. & &&...그래서 다음과 같이 변경했습니다.

set -e
cd foo
git pull
node server.js &
pid=$!
echo "$pid"

&&하지만 이중 앰퍼샌드를 대신 사용할 수 있는 방법이 있나요 ?

아마도 질문의 목적은 이 두 가지가 동일한지 여부일 것입니다.

cd foo && git pull && node server.js & && pid=$! && echo "$pid"
cd foo && git pull && ( node server.js & ) && pid=$! && echo "$pid"

내 추측으로는 그들은아니요동일한..

답변1

cmd1 && cmd2cmd1"실행 , 성공하면 실행 " 을 의미합니다 cmd2. 실행이 완료될 때까지 명령이 성공했는지 여부를 알 수 없으므로 하나의 명령을 백그라운드에 두고 다음 명령의 실행이 첫 번째 명령의 성공에 따라 달라지도록 하는 것은 의미가 없습니다.

당신이 정말로 원하는 것은 " cmd1백그라운드에서 시작한 다음 실행 cmd2"하는 것 같습니다. 이것은 단지 입니다 cmd1 & cmd2.

따라서 원하는 명령은 다음과 같습니다.cd foo && git pull && node server.js & pid=$! && echo "$pid"

답변2

공백은 무료입니다. IMO에서는 이와 같은 긴 명령 목록이 있으면 줄 바꿈이 가독성에 도움이 됩니다. &&논리적 의미 로 사용하려는 경우에도 다음과 같습니다.

cd foo &&
git pull && {
    node server.js &
    pid=$!
    echo "$pid"
}

node과 가 모두 성공한 경우에만 cd블록이 입력됩니다 git.

이 경우에는 set -e반환 코드를 직접 처리하기 때문에 유용성이 떨어진다고 생각합니다.

관련 정보