Mac에서 "$0"에 빼기 기호가 있는 이유는 무엇입니까?

Mac에서 "$0"에 빼기 기호가 있는 이유는 무엇입니까?

저는 수년간 GNU/Linux 사용자였지만 Mac에서 사용 가능한 프로세스 정보를 얻는 방법을 알 수 없습니다.

Mac OS(Snow Leopard)의 로그인 셸에서 이 문제 가 $0해결된다는 것을 깨달았습니다 .-bash이로 인해 Linux 환경에서 제대로 작동하는 특정 쉘 스크립트가 손상될 수 있습니다.*.

불행히도 맨페이지에는 이 사실이 언급되어 있지 않습니다.

bash가 명령 파일과 함께 호출되면 $0이 해당 파일 이름으로 설정됩니다. bash가 -c 옵션으로 시작되면 $0은 실행될 문자열 뒤의 첫 번째 인수(있는 경우)로 설정됩니다. 그렇지 않으면 인수 0으로 지정된 대로 bash를 호출하는 데 사용되는 파일 이름으로 설정됩니다.

빼기 기호에 특별한 의미가 있나요? /proc관련 실행 파일을 찾는 데 도움이 되는 명령줄 도구나 같은 것이 있습니까 ?

* 바보 나. 물론 $0은 매뉴얼에 명시된 대로 스크립트 이름으로 평가됩니다.

답변1

빼기 기호는 시스템이 로그인 쉘로 호출되고 소스 ~/.profile(Bourne 호환 쉘의 경우)가 되어야 함을 쉘에 알리는 방식입니다. 이는 Linux, OSX 및 기타 모든 유닉스에서 마찬가지입니다. 로그인 쉘에서는 스크립트가 실행되지 않습니다. 스크립트의 경우 $0스크립트 파일의 이름입니다(전체 경로 포함 또는 제외).

추가됨: 매뉴얼 페이지는 (거의 모든) 다양한 경우를 설명합니다.

  • "bash가 명령 파일과 함께 호출되면 $0이 해당 파일 이름으로 설정됩니다." 로 실행되는 스크립트 bash myscript뿐만 아니라 스크립트가 직접 실행되어 으로 시작되는 간접적인 경우도 포함됩니다 #!/bin/bash.

  • "bash가 -c 옵션으로 시작되면 $0은 실행될 문자열 다음의 첫 번째 인수(있는 경우)로 설정됩니다." 를 사용하면 -c호출자 $0가 명시적으로 나타내는 대로 설정됩니다.

  • "그렇지 않으면 인수 0에 지정된 대로 bash를 호출하는 데 사용되는 파일 이름으로 설정됩니다." 로그인 쉘은 이 경우에 속합니다. 쉘은 인수 0 이외의 인수 없이 호출되므로 $0인수 0으로 설정됩니다. login, su또는 쉘에 전달된 인수를 선택하고 -인수 0 앞에 a를 추가하여 로그인 쉘임을 쉘에 알리는 로그인을 처리하는 프로그램 입니다 .

아마도 인수 0에 대한 설명이 적절할 것입니다. 프로그램이 실행되면 최종적으로 execve시스템 호출이 발생합니다. 해당 시스템 호출에는 세 가지 인수가 사용됩니다.

  1. 기존 실행 파일을 지정해야 하는 파일 이름입니다. 커널은 이 파일을 로드하고 실행을 전송합니다.

  2. 인수라고 하는 문자열 배열입니다. 이 배열의 요소 0은 다음과 같습니다.관례에 따라위와 동일한 파일 이름 또는 환경 변수를 검색하여 실행 파일의 위치가 결정된 경우 전체 경로 없이 파일 이름만 사용됩니다 $PATH. 로그인 쉘과 같은 이 규칙에는 예외가 있습니다.

  3. 환경이라고 하는 또 다른 문자열 배열입니다.

를 입력하여 셸에서 프로그램을 호출할 때 myprogram foo bar인수는 다음과 execve같습니다.
    1. /usr/bin/myprogram(이것이 셸이 찾은 위치라고 가정 myprogram)
    2. myprogram, foo, bar
    3. 내보낸 각 셸 변수에 대해 변수 이름 뒤에 등호와 값이 옵니다. .

execve실행 중인 프로그램에서 전달된 실행 파일의 이름을 찾는 일반적인 방법은 없습니다 . Linux에서는 일반적으로 프로세스 ID가 /proc/$$/exe어디에 있는지 확인할 수 있습니다 . $$모든 유닉스에서는 이를 사용할 수 있지만 ps내부 작동 방식은 ps매우 다릅니다. 프로그램이 실행되는 동안 실행 파일이 삭제되거나 이름이 바뀔 수 있습니다. 이 경우 ps더 이상 사용되지 않는 정보가 보고되거나 정보가 보고되지 않을 수 있습니다.

답변2

에서 man bash:

exec [-cl] [-a 이름] [명령어 [인수]]
명령이 지정되면 쉘을 대체합니다. 새로운 프로세스가 생성되지 않습니다. 인수는 명령에 대한 인수가 됩니다. -l 옵션이 제공되면 쉘은 명령에 전달된 0번째 인수의 시작 부분에 대시를 배치합니다. 이것이 login(1)이 하는 일입니다. ...

답변3

-bash 에 무슨 일이 일어나고 있는지 잘 모르겠지만 쉘에서 bash를 다시 실행하면 $0 값이 괜찮은 것 같습니다.

이는 os x가 하고 있는 특별한 일인 것 같습니다. 터미널 프로그램에서 사용하는 기본 스크립트인 /usr/bin/login을 실행하면 $0과 동일한 문제가 나타납니다.

관련 정보