![&&는 백그라운드 스크립트에서 &와 함께 사용할 수 없습니다.](https://linux55.com/image/10889/%26amp%3B%26amp%3B%EB%8A%94%20%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%26amp%3B%EC%99%80%20%ED%95%A8%EA%BB%98%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
이 스크립트가 있습니다.
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 && cmd2
cmd1
"실행 , 성공하면 실행 " 을 의미합니다 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
반환 코드를 직접 처리하기 때문에 유용성이 떨어진다고 생각합니다.