프로세스가 터미널 창에서 직접 시작되거나 프로그래밍 방식으로 하위 프로세스로 시작되는지 결정합니다.

프로세스가 터미널 창에서 직접 시작되거나 프로그래밍 방식으로 하위 프로세스로 시작되는지 결정합니다.

사용자가 터미널에서 프로세스를 실행하는지 알 수 있습니까? 프로그램에서 프로세스를 시작하는 것과 달리 프로그램은 터미널에서 시작됩니다.

사용 사례는 터미널에서 실행된 경우 다음과 같습니다.

suman:
suman:
suman:

그러나 다른 프로그램 x에 의해 실행되고 x가 stdout/stderr 앞에 무언가를 추가하면 다음과 같이 보일 수 있습니다.

x: suman:
x: suman:

그러나 나는 이것을 감지하여 다음과 같이 보이고 싶습니다.

x:
x:    
x:

답변1

문제가 되는 프로세스의 상위 프로세스 ID(PPID)를 보고 PPID를 사용하여 해당 프로세스가 셸에서 실행되었는지 아니면 다른 프로그램에서 실행되었는지 확인할 수 있습니다.

예를 들어, 프로세스가 실행 중인 내용을 확인하려면 sleep해당 PPID를 조회하면 됩니다.

$ ps -ef | grep "sleep"
user       2470  1996  0 06:30 pts/1    00:00:00 sleep 60

PID 1996은 프로세스의 PPID입니다 sleep. grep지금 시작해 보겠습니다 .

$ ps -ef | grep 1996
user       1996  1995  0 05:57 pts/1    00:00:00 bash

PID 1996은 프로세스 bash를 잘 나타내는 쉘 입니다.sleep가능한터미널에서 실행하세요. 한 단계 더 나아가려면 grep프로세스의 PPID를 얻을 수 있습니다 bash.

$ ps -ef | grep 1995
user       1995   448  0 05:57 tty1     00:00:00 /usr/bin/urxvt

프로세스의 PPID는 가상 터미널 bash입니다 . urxvt따라서 sleep명령은 터미널에서 실행됩니다.

답변2

. 또는 이전을 사용하여 소스를 얻을 때 명령은 다음과 같습니다.메모소스 스크립트 이름은 나열되지 않습니다. 따라서 한 가지 방법은 grep을 수행하여 ps 출력에 소스 스크립트 이름이 포함되어 있는지 확인하여 소스 스크립트가 아님을 나타내는 것입니다.

예: "myscript" 파일에 다음 명령이 있다고 가정합니다.

cd /run/user/1000  #it will only affect terminal pwd if is sourced!

직접 실행하는 경우:

$ myscript  # ps will contain 'myscript' in the list.
# The cd command will not change the terminal current directory (pwd)

그렇지 않고 앞에 "source"나 점(.)을 사용하는 경우:

$ . myscript       # ps will not list "myscript" as it was sourced
$ source myscript  # source works the same as .
# Your terminal pwd will change to /run/user/1000

적용하려면 'myscript'를 변경하십시오.

ck=`ps | grep -o -m 3 -E 'myscript'`

cd /run/user/1000

if [ -n "$ck" ]; then # -n means "not empty"
  printf "\E[07;91mYou must source the script, run . myscript\E[0m\n"
  exit
fi

# or negative logic ... 

if [ -z "$ck" ]; then  # -z means null, empty
  echo "You are runnig the sourced script, now run pwd to check it"
fi

관련 정보