줄 연속 문자를 언제 사용하고 언제 사용하지 않습니까?

줄 연속 문자를 언제 사용하고 언제 사용하지 않습니까?

"Linux 명령줄 책"을 읽다가 다음 줄 연속 문자를 발견했는데 왜 이 문자를 find 명령과 함께 사용하는지 혼란스럽습니다.

find playground \
    \( \
        -type f \
        -not -perm 0600 \
        -exec chmod 0600 {} \; \
    \) \
    -or \
    \(
        other options...
    \)

그리고if 문과 함께 사용하면 어떨까요?

if [ $x -eq 5 ]; then 
    echo "x equals 5."
else
    echo "x does not equal 5."
fi

답변1

간단한 대답은 전자는 필요하고 후자는 필요하지 않기 때문입니다.

명령 find하나의몇 가지 다른 매개변수만 필요하고 자체 구조를 갖는 간단한 쉘 명령입니다. 이러한 인수는 셸에 아무런 의미가 없으므로 (와 사이에 논리적 연결이 있다는 것을 전혀 알 수 없습니다 ). 전체 명령은 한 줄에 작성할 수 있지만 읽기가 더 어렵습니다.

줄 연속이 없으면 find기본 인쇄 작업은 run playground이며, 쉘은 인수 없이 명령을 실행하려고 시도합니다(또는 이스케이프를 제거하려는 경우 하위 쉘에서 ().-type(

find playground
    \(
        -type f 
        ...

반면, if복합문은 쉘 구문의 일부이며 쉘은 어떤 부분이 필요한지 알고 있습니다. 그리고 마지막으로 or 뒤에는 then명령이 와야 합니다 . 전체 구조를 한 줄에 작성할 수도 있지만 및 앞에 세미콜론을 추가 해야 합니다 . ( 세미콜론이나 개행 문자도 두 개의 명령으로 처리되어야 합니다.)elsefielsefiecho foo; echo bar

답변2

이는 특히 복잡한 예입니다. 그 중 일부는 \"라인 연속"이라고 부르지만 다른 일부는 보호 문자용이므로 쉘은 이를 해석하지 않고 대신 에 전달하므로 쉘이 , 및 Exists 를 사용합니다 find. 이스케이프 문자를 해석하지 않고 있는 그대로 전달합니다 . 공백이 아닌 문자 바로 앞에 오지 않는 나머지는 줄 연속 신호입니다.\(\)\;find\

일반적으로 말하면, 명령을 어기려면 다음이 필요합니다.\ ~하지 않는 한너는 그 중 하나를 깨뜨렸다"목록 종결자"수치. 따라서 다음 중 하나를 자르면 다음이 필요하지 않습니다 \.

; & && || | |& ;; 

예를 들어 다음 echo foo && echo bar과 같이 작성할 수 있습니다.

echo foo &&
echo bar

불필요한 \. 또는 다음과 같이 작성할 수도 있습니다.

echo \
foo \
&&
echo \
bar

\명령의 끝도 아니고 목록 종결자가 아닌 곳에서 잘라낼 때 어떻게 사용하는지 참고하세요.

다른 곳에 잘라내기 명령이 있는 경우 필수입니다 . 해당 위치에는 잘라내기 명령이 없기 때문에 예제 에 해당 명령을 \표시할 필요가 없습니다 . 각 명령은 자체 라인에 있으므로 괜찮습니다. 하나를 깨고 싶다면 다음이 필요합니다.\if ... then ... else ...\하나의여러 줄에 대한 명령입니다.

@paul_pedant가 주석에서 올바르게 지적했듯이 작은따옴표를 사용하여 다음을 이스케이프하면 명령이 더 명확해질 수 있습니다 find.

find playground \
    '(' \
        -type f \
        -not -perm 0600 \
        -exec chmod 0600 {} ';' \
    ')' \
    -or \
    '('
        other options...
    ')'

관련 정보