저는 debian 스트레치에 있으며 안정적인 저장소에서 CMUCL을 설치합니다. 다음cmucl : run-program 출력 프로세스가 종료되었습니다.
(run-program "sh" '("ls") :output T)
을하려고 할 때 나는
#<process 2845 :EXITED>
는 예상 출력하지 않고 얻을. 어떤 도움을 주시겠습니까?
저는 debian 스트레치에 있으며 안정적인 저장소에서 CMUCL을 설치합니다. 다음cmucl : run-program 출력 프로세스가 종료되었습니다.
(run-program "sh" '("ls") :output T)
을하려고 할 때 나는
#<process 2845 :EXITED>
는 예상 출력하지 않고 얻을. 어떤 도움을 주시겠습니까?
읽기 ls(1) 및 dash(1) & bash(1). POSIX /bin/sh
은 종종 그 중 하나의 심볼릭 링크입니다 (종종 dash
, 때로는 bash
). 의 역할을 알고 있어야합니다 (예 : shells 및 execvp(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 directory에 ls
이없는 시도 할 수 shell script이 아니지만 실행 파일이 ELF 인 경우 (Linux의 경우 Unix는 대부분 executable이며 scrip이 아님) 티). 따라서 /bin/sh ls
(또는 sh ls
)은 원하는대로 작동하지 않습니다.
ls
을 실행하려면 셸을 시작할 필요가 없습니다! 그리고 opendir(3)readdir(3)stat(2) 을 FFI (또는 찾으려고하거나 some 패키지를 찾으려고하기 때문에) 그 목적을 위해 ls
프로세스를 포크 할 필요가 없습니다.
추신. 나는 이것들을 테스트하기 위해 SBCL을 사용했다.
답변에 많은 감사드립니다. 'ls'는 단지 예일뿐입니다. 결국 쉘과 함께 다른 작업을 수행하고 싶습니다. 그러나 나는 기대했던 결과를 얻는다. 예를 들어'(run-program "/ bin/sh"("cat" "hello '>"test1.txt ") : output t)'는 필자가 이해하는 한 test1.txt 파일을 작성해야합니다. – DJJ
데비안에 패키지 된'sbcl'을 고려해야합니다. –
예, sbcl이 더 많이 활성화되어 있지만 사람들이 다른 구현을 사용하지 못하게해야합니다. Common Lisp 생태계가 여러 개의 오픈 소스 구현을 갖는 것이 중요합니다. – Svante