에코 전에 env 디렉토리가 호출되는 이유는 무엇입니까?

에코 전에 env 디렉토리가 호출되는 이유는 무엇입니까?

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방지 하므로 echoPATH에서 처음 발견된 실행 파일이 사용됩니다. echo동작은 각 구현에 따라 다를 수 있지만 여기서는 특별한 내용을 볼 수 없습니다. 두 경우 모두 "What now?"가 인쇄되어야 합니다. 단 운이 좋지 않거나 현재 디렉토리에 "whatz"와 같이 "what"으로 시작하는 5글자 이름의 파일이 있는 경우는 제외됩니다. 그렇다면 인쇄 내용은 다음과 같습니다.

지금은 뭐야?

관련 정보