system()
의 문제점 중 하나는 명령 줄을 구문 분석하고 실행하기위한 셸 구문 및 언어에 대한 지식을 의미한다는 것입니다. 이것은 입력을 적절하게 검증하지 않은 버그에 대한 가능성을 만들어 내며, 쉘은 변수 대체와 같은 것을 해석하거나 예상하지 못한 방식으로 인수가 시작하거나 끝나는 위치를 결정할 수 있습니다. 또한, 다른 OS의 쉘은 당신이 즉시 알아 차릴 수 없을 정도로 미묘한 분기를 포함하여 당신 자신의 다른 구문을 가질 수 있습니다. 이런 이유 때문에 system()
대신 execve()
을 사용하는 것이 더 좋습니다. 즉, argv
토큰을 직접 전달할 수 있으며 입력 내용을 중간에 분석 (잘못 분석) 할 필요가 없습니다.
system()
(이것은 execve()
에도 적용됩니다)의 또 다른 문제점은 코드를 작성할 때 "이 프로그램을 찾아서이 인수를 전달하십시오"라는 것입니다. 이것은 버그로 이어질 수있는 몇 가지 가정을합니다. 첫째, 프로그램이 존재하며 $PATH
에서 찾을 수 있습니다. 어쩌면 어떤 시스템에서는 그렇지 않을 수도 있습니다. 둘째, 어쩌면 일부 시스템 또는 향후 OS 버전에서 다른 옵션을 지원할 것입니다. 이 의미에서, 나는 당신이 절대적으로 당신이 달릴 시스템이 프로그램을 가질 것이라는 것을 확신하지 않는 한 이것을하는 것을 피할 것입니다. (어쩌면 호출 프로그램을 시스템에 두거나, 호출하는 방법이 POSIX와 같은 명령에 의해 위임 된 것처럼)
마지막으로 ... 올바른 프로그램을 찾는 것과 관련하여 성능이 저하됩니다. 새 프로세스 만들기, 프로그램로드 등mv
과 같은 간단한 작업을 수행하는 경우 시스템 호출을 직접 사용하는 것이 훨씬 효율적입니다.
다음은 system()
을 피하기위한 몇 가지 이유입니다. 분명히 더 있습니다.
지금까지 해답 이외에도 "접착제"언어로 파이썬을 사용하면 손에서 쉽게 벗어날 수 있습니다. 명령 줄에서 쉽게 수행 할 수있는 작업의 자동화 된 실행이 거의 대부분이며 Unix 이외의 시스템에 대해 걱정할 필요가없는 프로그램이있는 경우 셸 스크립트를 사용하지 않는 이유는 무엇입니까? –
os.system 대신 subprocess 모듈을 사용하십시오. 프로세스에 대한 모든 종류의 제어를 원한다면 감사 할 것입니다. –