이스케이프된 매개변수로 명령을 실행하려면 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 호환 echo
s는 \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