환영합니다.
은 명심 C에서 프로그램을 자신의 main
기능에 대한 다음 호출 규칙이 있습니다
int main(int argc, char *argv[])
이 프로그램이 아닌 아닌 하나의 문자열 개인, 별도의 인수 목록이 전달되는 것을 의미한다을 아직 파싱 된. 인수의 벡터가 파싱 된 원본 문자열은 호출 된 프로그램에 전혀 제공되지 않습니다. 종종 "원래 문자열"도 존재하지 않습니다. 결과적으로 호출 된 프로그램은 "종을 해제"하고 구문 분석 된 문자열 목록에서 해당 문자열이 생성 된 원래 문자열로 돌아갈 방법이 없습니다.
결과적으로 스크립트가 외부 명령 (쉘 기능과 반대)으로 호출되면 운영 체제에서 실행하는 쉘 호출은 the execve
syscall을 거치며 인수는 (1) 실행할 파일; (2) 그것을 전달하기위한 인수 벡터 (즉 앞서 언급 한 개별 C 문자열의 목록); (3) 환경 변수 목록. 분석되지 않은 쉘 명령 행에 대한 인수가 없으므로 해당 내용을 서브 프로세스에서 사용할 수 없습니다.
적절한 인용을 사용하도록 사용자를 교육하십시오.
yourscript '#1234' # single quotes prevent content from being parsed as shell syntax
yourscript ''#1234 # "#" only begins a comment at the front of a string
yourscript '#'1234 # note that shell quoting is character-by-character
yourscript \#1234 # ...so either quoting or escaping only that single character suffices.
가 ... 위 중 하나를 포함하는 argv
을 전달합니다 (C 구문) char[][]{ "yourscript", "#1234", NULL }
어떤 생각을 선도적 파운드 _why_ : 아래의 모든
yourscript
에 관한하는 한, 완전히 구별 할 수없는 행동을해야합니다 이 (의도하지 않은) 부작용이 있습니까? –@ 리차드 헤이븐, 의도하지 않은 것은 무엇입니까? 그것은 주석 구문입니다. C에서 코드로 파싱되지 않는'/ * something * /','Python에서는 코드로 해석되지 않는'# something', C++에서는'// something'보다''의도하지 않은 ' ->'SGML 계열 언어 등 –
명령 행을 단일 행 스크립트로 취급하고있는 경우, 8 진수는 해당 행에서의 명령으로 해석됩니다. 지금 받으십시오. –