プロセスがターミナルウィンドウから直接開始されるか、プログラムでサブプロセスとして開始されるかを決定します。

プロセスがターミナルウィンドウから直接開始されるか、プログラムでサブプロセスとして開始されるかを決定します。

ユーザーが端末でプロセスを実行しているかどうかはわかりますか?プログラムでプロセスを開始するのとは異なり、プログラムは端末で開始されます。

ユースケースは、端末で実行されている場合は次のとおりです。

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ですsleepgrep今始めましょう。

$ 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

。または、以前を使用してソースを取得する場合、コマンドは次のようになります。メモソーススクリプト名はリストされません。したがって、1つの方法は、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

関連情報