sh -c에 대한 쉘 이스케이프 문자

sh -c에 대한 쉘 이스케이프 문자

이스케이프된 매개변수로 명령을 실행하려면 sh -c를 사용해야 합니다. 이 문자열이 보기 흉해 보인다는 것은 알지만 간단한 문자열로는 문제가 발생하지 않습니다.

sh -c에 전달될 때의 에코 출력은 단독으로 실행될 때와 다르며 이를 해결하는 방법을 찾으려고 노력하고 있습니다.

배경: [1] 이것이 전달될 때 echo 명령에 대한 인수를 이스케이프하고 추가 명령이 삽입되지 않았는지 확인하고 싶습니다. [2] sh -c는 |나 nohup 등의 쉘 기능을 사용하고 싶기 때문에 사용합니다. [3] 관련이 없을 수도 있지만 이는 원격 서버에 대한 SSH 연결을 통해 실행됩니다.

sh -c 명령의 명령 및 출력은 다음과 같습니다.

sh -c "echo \a\\\\\b\;\c"

;c

독립 실행형 명령의 명령 및 출력은 다음과 같습니다.

echo \a\\\\\b\;\c

a\\b;c

어떤 도움이라도 대단히 감사하겠습니다!

답변1

\일부 문자(예 \: , ", $) 를 이스케이프 `하고 큰따옴표 안의 개행 문자를 제거하는 데 사용됩니다.

sh -c "echo \a\\\\\b\;\c"

처럼

sh -c 'echo \a\\\b\;\c'

sh는 \각 문자를 이스케이프하는 데 사용되므로 다음과 동일해집니다.

echo 'a\b;c'

UNIX 호환 echos는 \b백스페이스 문자( ^H)로 확장됩니다. 이 문자는 터미널로 전송될 때 커서를 한 문자 뒤로 왼쪽으로 이동하여 덮어쓰므 ;a가 표시됩니다 ;c.

echo이식할 수 없는 명령이며 그 동작은 쉘과 시스템에 따라 다릅니다. 특히 주어진 인수에 백슬래시가 포함되거나 대시로 시작될 수 있는 경우에는 이를 피하는 것이 가장 좋습니다. 대신 printf를 사용하세요.

sh -c 'printf "%s\n" "a\\\\b;c"'

출력 a\\b;c.

(3개의 백슬래시로 충분하지만 큰따옴표 안에 백슬래시 두 개가 필요하다는 점을 기억하는 것이 더 안전합니다.)

이스케이프 시퀀스를 확장하는 것과 같은 구현 의 경우 echo백슬래시 수를 두 배로 늘려야 합니다.

sh -c 'echo "a\\\\\\\\b;c"'

큰따옴표를 피하려면 셸의 유일한 특수 문자( 큰따옴표 버전에서 이미 이스케이프한 문자 ;에 추가 )만 이스케이프하세요.\

sh -c 'echo a\\\\\\\\b\;c'

작은따옴표 대신 큰따옴표를 사용하려면 백슬래시 수를 다시 두 배로 늘려야 합니다.

sh -c "echo a\\\\\\\\\\\\\\\\b\\;c"

따옴표를 제거하려면 공백을 이스케이프하고 ;셸을 다시 이스케이프해야 합니다.

sh -c echo\ a\\\\\\\\\\\\\\\\b\\\;c

관련 정보