![에코 전에 env 디렉토리가 호출되는 이유는 무엇입니까?](https://linux55.com/image/111364/%EC%97%90%EC%BD%94%20%EC%A0%84%EC%97%90%20env%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EA%B0%80%20%ED%98%B8%EC%B6%9C%EB%90%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
C로 작성된 프로그램을 보고 있어요. 이 프로그램의 문제는 이 코드 줄에 달려 있습니다.
system("/usr/bin/env echo and now what?");
나는 system()이 명령을 실행한다는 것을 알고 있습니다. 하지만 왜 이런 일이 일어나는지 잘 모르겠습니다.
종종 그것은 단지 "에코, 지금은 어떻습니까"일 뿐입니다. 그런데 왜 "usr/bin/env"를 앞에 두어야 할까요? 그게 정확히 무슨 역할을 하나요?
답변1
/usr/bin/env
프로그램 이름 다음에 프로그램을 실행합니다. 환경 변수에 의해 구성된 디렉터리에서 실행 파일로 프로그램 이름을 찾습니다 PATH
. 이것은 : 다음에 일부 환경 변수 할당, 그 다음 프로그램 이름 및 인수를 env
사용하는 특별한 경우 입니다. 여기에는 정확히 0개의 변수 할당이 있습니다.env
/usr/bin/env echo …
/bin/echo …
경로를 하드코딩하지 않는다는 점을 제외하면 동일합니다 . echo
시스템과 값에 따라 , , , , , , …PATH
/bin/echo
/usr/bin/echo
/usr/xpg4/echo
/usr/ucb/echo
/usr/local/bin/echo
/home/bob/bin/echo
거의 모든 쉘에는 echo
내장 명령이 있습니다. 쉘 내장 명령과 외부 명령 사이의 동작에 차이가 있을 수 있습니다. 실제로 echo
두 가지 측면에서 명령 사이에는 차이점이 있습니다. 첫 번째 인수가 다음으로 시작하면 어떻게 되는지 -
(일부 버전에서는 echo
여러 옵션을 처리함) 백슬래시를 처리하는 방법(일부 버전에서는 문자 그대로 인쇄하고 다른 버전에서는 이스케이프 문자로 처리함) . 따라서 echo
이러한 구현 종속 동작을 사용하려는 경우 강제 버전이 유용할 수 있습니다. 대부분의 경우 사용하는 것이 더 좋습니다 printf
. 골동품을 제외하고는 휴대할 수 있고 휴대할 수 있는 printf
모든 기능을 수행합니다.echo
예제 코드에 전달된 매개변수를 사용하면 에코 구현 선택이 중요하지 않습니다. 이 광기의 이유가 있다면 그것을 알아내는 데 좀 더 많은 맥락이 필요할 것입니다.
답변2
나는 system()이 명령을 실행한다는 것을 알고 있습니다.
옳은.
종종 그것은 단지 "에코, 지금은 어떻습니까"일 뿐입니다.
마지막 문자가 누락되었습니다.
그런데 왜 "/usr/bin/env"를 앞에 두어야 할까요?
이는 명령의 전체 경로 env
와 대신 실행할 명령 입니다 echo
.
그게 정확히 무슨 역할을 하나요?
echo
함수가 생성된 셸에서 내장 함수가 실행되는 것을 system
libc
방지 하므로 echo
PATH에서 처음 발견된 실행 파일이 사용됩니다. echo
동작은 각 구현에 따라 다를 수 있지만 여기서는 특별한 내용을 볼 수 없습니다. 두 경우 모두 "What now?"가 인쇄되어야 합니다. 단 운이 좋지 않거나 현재 디렉토리에 "whatz"와 같이 "what"으로 시작하는 5글자 이름의 파일이 있는 경우는 제외됩니다. 그렇다면 인쇄 내용은 다음과 같습니다.
지금은 뭐야?