일반적으로 다음과 같이 별도의 줄에 긴 명령을 입력합니다.
myapp -a foooooooo1 \
-b foooo2 \
-c foooooooooooooooo3 \
-d foooooooo4 \
bar
하지만 나는 그것을 다음과 같이 바꾸고 싶습니다.
myapp -a foooooooo1
\ -b foooo2
\ -c foooooooooooooooo3
\ -d foooooooo4
bar
첫 번째 코드 부분을 변경할 때 백슬래시가 서로 올바르게 정렬되도록 수동으로 조정해야 하기 때문에 이 작업을 수행하고 싶습니다. 두 번째 코드 부분에서는 매개변수 중 하나를 변경해도 백슬래시가 움직이지 않습니다.
답변1
쉘 명령에서 따옴표가 없는 백슬래시는 다음 문자를 이스케이프합니다. 다르게 말하면 다음 문자에 특별한 의미가 있는 경우 백슬래시가 해당 문자의 특별한 의미를 제거한다는 것입니다.
개행 문자는 ;
다른 문자와 마찬가지로 명령 종결자입니다. 백슬래시는 개행 문자에서 해당 기능을 제거하여 명령이 다음 줄에서 계속될 수 있도록 합니다. 그건 그렇고, 계속되어야 하는 줄 끝의 백슬래시 뒤에 공백 문자를 가질 수 없는 이유는 백슬래시가 실제 개행 문자를 이스케이프하지 않기 때문입니다.
쉘은 제안한 코드를 올바르게 구문 분석할 수 없습니다. 대신, 각 행을 별도의 명령으로 실행하려고 시도합니다.
쉘이 배열(예: bash
has)을 지원하는 경우 어떤 경우에 유용할 수 있는 또 다른 접근 방식은 다음과 같이 명령을 배열에 저장하는 것입니다.
mycommand=(
myapp -a 'foo foo'
-b 'bar bar'
-c 'baz baz'
-d 'qux qux'
bar
)
이 배열 할당의 개행 문자는 공백과 마찬가지로 배열 요소 사이의 구분 기호로만 사용됩니다. 포함된 공백이 필요한 요소는 예제에 표시된 대로 인용되어야 합니다(어떤 경우에도 명령줄에서 인용되어야 하는 것과 마찬가지로).
이 명령을 실행하려면 다음을 사용할 수 있습니다.
"${mycommand[@]}"
큰따옴표는 다음과 같습니다.기초적인. 배열의 각 요소가 개별적으로 참조되도록 합니다.
또는 매개변수에 대한 배열을 사용하세요.
myapp_args=(
-a 'foo foo'
-b 'bar bar'
-c 'baz baz'
-d 'qux qux'
bar
)
그런 다음:
myapp "${myapp_args[@]}"