명령이 스크립트에서 나오는지 아니면 명령줄에 수동으로 입력되는지 알아내는 것이 가능합니까?

명령이 스크립트에서 나오는지 아니면 명령줄에 수동으로 입력되는지 알아내는 것이 가능합니까?

사용자 정의 명령을 사용하여 특정 도구에 대한 환경을 설정할 수 있는 구현이 있습니다.

예: custom_command 도구_이름

이 명령은 통화 시간, 사용자 및 도구 이름을 로그 파일에 기록합니다.

이러한 로그를 통해 특정 도구가 마지막으로 사용된 시기를 확인할 수 있습니다.

이제 사용자는 로그인 프로필에 명령을 입력하는 데 익숙합니다.

그렇다면 명령줄이나 다른 스크립트에서 수동으로 입력하여 comamnd가 호출되고 있는지 확인할 수 있습니까? 그렇다면 스크립트 이름은 무엇입니까?

여러 가지 방법을 시도해 봤습니다. 내가 찾을 수 있는 것은 쉘이라는 상위 스크립트 이름뿐입니다.

내 이해는 이것이 불가능하다는 것입니다. 하지만 나는 단지 내 행운을 시험해보고 싶었습니다.

답변1

bash스크립트 에서는 보통 다음과 같이 합니다.

#!/bin/bash

if test "$0" != "$BASH_SOURCE"; then
    SOURCED=1
    MY_NAME=$BASH_SOURCE
else
    SOURCED=0
    MY_NAME=$0
fi

# do something here

if test "$SOURCED" = "1"; then
    # use return instead of exit
    return
fi

# do something here only when not sourced
exit

답변2

나는 이것이 완전히 가능하다고 생각하지 않습니다.

물론 상위 프로세스가 무엇인지, 해당 명령줄 인수가 무엇인지 알 수 있지만 궁극적으로 대화형 셸을 실행할 때 시작 스크립트에서 실행되는 프로그램의 상위 프로세스는 대화형으로 실행되는 프로그램과 동일합니다.

실행된 위치에만 있는 경우 .profile소스가 이후에 있다는 사실로 이를 감지할 수 있습니다 /etc/bashrc(이 셸에서 실행 무시를 중지하는 명령을 입력할 수 있기 때문입니다).

또 다른 접근 방식은 상위 프로세스의 시작 시간을 확인하는 것입니다. 일반적으로 명령의 대화형 실행은 셸이 시작된 직후에 실행되고, init 스크립트는 셸이 시작된 직후에 실행됩니다.

더 정교한 아이디어는 이를 보다 사용자 정의된 방식으로 시작 파일의 출처를 제어하는 ​​래퍼로 바꾸는 것입니다 /bin/bash(이 아이디어는 첫 번째 아이디어와 유사하지만 명령이 실행됩니다)뒤쪽에 .bashrc). 이것이 좋은 생각인지는 모르겠지만 적어도 이 작업을 수행할 때는 매우 조심해야 합니다.

관련 정보