2017-12-06 2 views
0

저는 debian 스트레치에 있으며 안정적인 저장소에서 CMUCL을 설치합니다. 다음cmucl : run-program 출력 프로세스가 종료되었습니다.

(run-program "sh" '("ls") :output T) 

을하려고 할 때 나는

#<process 2845 :EXITED>

는 예상 출력하지 않고 얻을. 어떤 도움을 주시겠습니까?

+0

데비안에 패키지 된'sbcl'을 고려해야합니다. –

+2

예, sbcl이 더 많이 활성화되어 있지만 사람들이 다른 구현을 사용하지 못하게해야합니다. Common Lisp 생태계가 여러 개의 오픈 소스 구현을 갖는 것이 중요합니다. – Svante

답변

3

읽기 ls(1)dash(1) & bash(1). POSIX /bin/sh은 종종 그 중 하나의 심볼릭 링크입니다 (종종 dash, 때로는 bash). 의 역할을 알고 있어야합니다 (예 : shellsexecvp(3)). system(3)-c과 함께 /bin/sh을 사용하고 있으며 sh (POSIX 셸이라고 가정)에 문자열을 명령으로 해석하려면 -c이 필요합니다. (그것은 /bin/ls을해야 POSIX에 PATH에 있지만 다른 곳)과 /bin/ls이다

당신은

(run-program "/bin/ls" nil :output t) 

또는

(run-program "/bin/sh" '("-c" "ls") :output t) 

당신은 아마 당신의 working directoryls이없는 시도 할 수 shell script이 아니지만 실행 파일이 ELF 인 경우 (Linux의 경우 Unix는 대부분 executable이며 scrip이 아님) 티). 따라서 /bin/sh ls (또는 sh ls)은 원하는대로 작동하지 않습니다.

ls을 실행하려면 셸을 시작할 필요가 없습니다! 그리고 opendir(3)readdir(3)stat(2)FFI (또는 찾으려고하거나 some 패키지를 찾으려고하기 때문에) 그 목적을 위해 ls 프로세스를 포크 할 필요가 없습니다.

추신. 나는 이것들을 테스트하기 위해 SBCL을 사용했다.

+0

답변에 많은 감사드립니다. 'ls'는 단지 예일뿐입니다. 결국 쉘과 함께 다른 작업을 수행하고 싶습니다. 그러나 나는 기대했던 결과를 얻는다. 예를 들어'(run-program "/ bin/sh"("cat" "hello '>"test1.txt ") : output t)'는 필자가 이해하는 한 test1.txt 파일을 작성해야합니다. – DJJ

관련 문제