Bash(한 줄): 첫 번째 명령이 성공하면 두 번째 명령을 실행하고, 그렇지 않으면 세 번째 명령을 실행합니까?

Bash(한 줄): 첫 번째 명령이 성공하면 두 번째 명령을 실행하고, 그렇지 않으면 세 번째 명령을 실행합니까?

SSH를 통해 두 개의 명령을 순차적으로 실행하고 싶습니다. 대화형 쉘이 없습니다. 두 번째 명령은 첫 번째 명령이 성공한 경우에만 실행해야 하지만 해당 줄은 스크립트 내부에 있으므로 두 번째 명령이 이런 방식으로 실행되지 않을 경우 사용자 친화적인 피드백을 받고 싶습니다. 그 후에는 스크립트의 나머지 부분이 계속 실행되어야 하므로 exit여기서는 기다릴 수 없습니다.

&&예를 들어 부울 연산자를 사용하여 실패할 경우 실행을 foo && bar차단 bar하고 실패할 경우에만 실행할 수 있다는 것을 알고 있습니다 . 그런데 서로 어떻게 어울리는지 좀 헷갈리네요.foobar || bazbazbar

그것들을 추가하세요:

(SSH를 통해 실행되며 대화형 셸이 필요하지 않음)

  1. 구현하다foo
  2. barfoo성공한 경우 에만 실행
  3. bazfoo실패 시에만 실행하고 실행을 차단합니다.bar

ssh user@host "foo && bar || baz"

방금 설명한 내용을 수행하는 올바른 방법인가요?

답변1

귀하의 예 를 사용 foo && bar || baz하면bazbar 또는 foo실패하다. 귀하의 설명에 따르면 이는 귀하가 원하는 것이 아닙니다. if목표를 달성하기 위해 다음 설명을 사용할 수 있습니다 .

if foo; then
    bar
else
    baz
fi

또는 한 줄로 작성하고 싶다면 다음과 같이 하세요.

if foo; then bar; else baz; fi

답변2

쉘 스크립트의 전체 구문은 명령에 제공됩니다 ssh. (이 명령은 원격 계정의 기본 셸에 의해 실행됩니다. 여기서는 sh호환된다고 가정합니다.)

복합 명령은 따옴표로 묶어야 합니다. 큰따옴표를 사용하는 것이 맞지만 작은따옴표는 모든 쉘 특수 문자를 보호하므로 원격 명령에서 중요한 쉘 구성을 사용하려는 경우 중요할 수 있습니다.

그렇다면 원하는 작업을 수행하는 방법은 다음과 같습니다.

ssh user@host 'foo && bar || { echo foo failed >&2; baz; }'

임의로 복잡한 조건을 사용할 수도 있습니다.

ssh user@host '
    if foo; then
         bar
    else
        echo foo failed >&2
        baz
    fi'

(예, 작은따옴표 안의 여러 줄 문자열입니다.)

관련 정보