Bash : 타사 앱에서 터미널을 열 었는지 확인하는 방법


9

내 bash 스크립트 (특히 my ~/.bashrc)가 터미널을 직접 열었을 때만 무언가를하고 VS 코드와 같은 응용 프로그램을 통해 열린 경우 다른 것을 원합니다. 사건이 무엇인지 어떻게 알 수 있습니까? 그 변수가 있습니까? 미리 감사드립니다.


1
일종의 방법이 있습니다. 첫 번째 응답은 askubuntu.com/a/1042727/295286의 두 번째 예와 함께하는 것 입니다. VS를 열고 env명령을 실행하십시오. 사용할 수있는 VS 특정 변수가 있는지 확인하십시오.
Sergiy Kolodyazhnyy 2018 년

1
아무것도 없다면 다른 방법으로 시도하십시오 : 터미널 에뮬레이터가 변수를 설정하는지 확인하십시오. yakuake변수 PULSE_PROP_OVERRIDE_application.name=Yakuake세트를 사용 하고 있으며 내 컴퓨터에서 xterm설정 XTERM_VERSION=XTerm(322)합니다.
디저트

@SergiyKolodyazhnyy 환경 변수 접근 방식에 대한 답변을 작성 하시겠습니까?
디저트

@dessert하지만 VS를 설치하지 않았지만 래치 할 수있는 특정 환경 변수가 있으면 OP가 응답하지 않았습니다.
Sergiy Kolodyazhnyy 2018 년

@SergiyKolodyazhnyy 나도 없지만 질문 제목 에 타사 앱이 표시되어 있으며 터미널 에뮬레이터와 동일하게 작동한다고 가정합니다 env >env_term1. 하나의 에뮬레이터 와 같은 응답 env >env_term2이 두 번째 에뮬레이터 와 같은 것으로 생각 되며 사용 방법 diff env_term{1,2}이 매우 유용합니다. 결국 OP는 예를 들어 VS Code 라고 말합니다 .
디저트

답변:


10

당신은 아마도 쉘의 조상을 거슬러 올라가서 "당신"과 같은 것에 의해 시작되었는지 아니면 다른 프로그램에 의해 시작되었는지를 알아낼 수 있습니다.

쉘의 PID (프로세스 ID)와 PPID (부모 프로세스 ID)를 가져옵니다. 어디에서 왔는지 알려줄 때까지 계속 올라가십시오. 시스템을 실험해야 할 수도 있습니다. 적어도 보편적인지는 모르겠습니다.

예를 들어, 내 시스템에서 쉘의 PID를 가져 와서 다음과 같이 ps표시합니다 bash.

$ echo $$
18852
$ ps --pid 18852
  PID TTY          TIME CMD
18852 pts/1    00:00:00 bash

18852의 PPID를 얻으십시오.

$ ps -o ppid= -p 18852
18842

PPID (18842)가 무엇인지 확인하십시오.

$ ps --pid 18842
  PID TTY          TIME CMD
18842 ?        00:00:02 gnome-terminal

우리는 그놈 터미널, 즉 터미널 에뮬레이터 / 터미널 창을 볼 수 있습니다. 다른 프로그램에서 시작한 쉘이 터미널 에뮬레이터 창에서 실행되고 있지 않은 경우에는 충분합니다.

충분하지 않으면 다른 수준으로 올라갑니다.

$ ps -o ppid= -p 18842
 2313
$ ps --pid 2313
  PID TTY          TIME CMD
 2313 ?        00:00:00 init

이것에 gnome-terminal의해 시작 되었음을 알려줍니다 init. 다른 프로그램으로 시작한 쉘에 다른 것이있을 것입니다.


... 혹은 결과까지 도보로pstree -s $$
steeldriver을

9
"이것은 그놈 터미널이 init에 의해 시작되었다는 것을 알려줍니다"init가 터미널 창을 시작할 가능성이 낮습니다. 오히려, 그놈 터미널을 시작한 것은 무엇이든 죽었고, 그놈 터미널은 초기화하기 위해 다시 양육되었다. 그놈 터미널을 확인하면 이중 포크입니다. 따라서 실행되면 먼저 자체 분기하여 원래 프로세스를 종료하고 새로운 프로세스를 계속합니다.
JoL

@JoL 페어 포인트. 그 init과정은 pid 1이 아니며, 그것이 변경 될지 확실하지 않습니다.
kasperd

고마워요! VS Code 나 Eclipse 모두 ​​터미널을의 자식으로 실행하지 않는다는 것을 감지 할 수있었습니다 gnome-terminal. 나는 명령을 if [ $(pstree -s $$ | grep "gnome-terminal" -c) -gt 0 ]; then ...내렸고 효과가 있었다.
PaperBag

9

Visual Studio Code가 진행 되는 한 통합 터미널에 대한 추가 환경 변수 를 설정하는 방법이 분명히 있습니다. 따라서이 구성을 사용하도록 Visual Studio를 설정하십시오.

"terminal.integrated.env.linux": {
  "visual_studio": "true"
}

그리고 내 ~/.bashrc:

if [ -n "$visual_studio" ]; then
    # do something for Visual Studio
else
    # do something else for other types of terminal
fi

일반적으로 bash프로세스에 주어진 환경에 의존 할 수 있습니다. 예, 들어 변수 와 유사한 실행 을위한 지점 또는 뭔가. 사례별로, 당신은 실행을 통해 환경의 차이를 조사 할 수 있습니다 같이 파일이 저장, 각 콘솔에서 , 그리고 에 의해 제안 코멘트에 디저트 .$TERMif..then...else...fi[ "$TERM" = "xterm" ]envenv > output_console1.txtdiff output_console1.txt output_console2.txt


$Env:varBash의 환경 변수 구문이 아닙니다. 이것은 나에게 Powershell 것 같습니다.
Dietrich Epp 2018 년

@DietrichEpp 예, 원래 Visual Studio에서 추가 환경 변수를 설정하는 방법을 연구했지만 PowerShell을 사용하여 답변을 간과했습니다. 그래서 $foo충분하다. 커피만으로는 충분하지 않습니다.
Sergiy Kolodyazhnyy 2018 년

env 설정이없는 타사 프로그램의 일반적인 경우, 프로그램을 실행 하기 전에 랩퍼에서 사용자 정의 env var를 설정할 수 있습니다. 내 답변을 참조하십시오 .
피터 코 데스

2

특정 타사 앱에 대해 이야기하는 경우 환경 변수를 사용하십시오. 대부분의 프로그램은 새로운 프로세스를 분기 할 때 변경없이 전체 환경을 통과합니다.

따라서 확인할 수있는 사용자 정의 env var로이 앱을 시작하십시오 . 예를 들어 같은 별칭을 alias vs=RUNNING_FROM_VSCODE=1 VSCode만들거나 다음과 같이 래퍼 스크립트를 만듭니다.

#!/bin/sh
export RUNNING_FROM_VSCODE=1
exec VSCode "$@"

그런 다음에 .bashrc할 수 있습니다

if (($RUNNING_FROM_VSCODE)); then
   echo "started from inside VSCode"
   # RUNNING_FROM_VSCODE=0  # optional if you only want the immediate child
fi

(( ))표현식이 0이 아닌 정수로 평가되면 bash 산술 문장 은 true입니다 ( 1위에서 사용한 이유 ). 빈 문자열 (설정되지 않은 env var의 경우)은 false입니다. bash 부울 변수에는 좋지만 true전통적인 POSIX 로 쉽게 사용 하고 확인할 수 있습니다.

if [ "x$RUNNING_FROM_VSCODE" = "xtrue" ]; then
   echo "started from inside VSCode"
fi

앱이 주로 어린이를위한 환경을 지우고$PATH 변경되지 않은 채 통과하는 경우 래퍼에서 이것을 사용할 수 있습니다.

#!/bin/sh
export PATH="$PATH:/dev/null/RUNNING_FROM_VSCODE"
exec VSCode "$@"

bash와 같은 패턴 일치 [[ "${PATH%RUNNING_FROM_VSCODE}" != "$PATH" ]]로 PATH에서 접미사를 제거하면 변경되는지 확인하십시오.

프로그램이 찾을 수없는 외부 명령을 찾을 때 이것은 하나의 추가 디렉토리 조회를 무해하게해야합니다. /dev/null는 어떤 시스템에서도 디렉토리가 아니기 때문에 ENOTDIRPATH 검색이 이전 PATH 항목에서 원하는 것을 찾지 못하면 신속하게 가짜 디렉토리로 사용하는 것이 안전 합니다.


래퍼 스크립트는 일반적으로 합리적인 접근 방식이므로 +1입니다. 유일한 단점은 3 개의 프로그램이있는 경우 3 개의 래퍼 스크립트 또는 3 개의 다른 인수를 사용하는 1 개의 래퍼 스크립트를 원할 때 지루할 수 있다는 것입니다. 그럼에도 불구하고 확실한 접근 방식입니다.
Sergiy Kolodyazhnyy 1

1

여기 내 2 센트입니다. 에 추가하십시오 .bashrc. terminals좋아하는 터미널로 교체 하고 자신의 export명령으로 명령하십시오.

run_in_terminal(){
  local parent_command="$(ps --no-headers --pid $PPID -o command | awk '{print $1;}')"
  local parent="$(basename $parent_command)"
  local terminals=( gnome-terminal st xterm ) # list your favorite terminal here
  if [[ ${terminals[*]} =~ ${parent} ]]; then
    # Your commands to run if in terminal
    export MY_VAR_IN_TERMINAL="test"
  fi
}
run_in_terminal

gnome-terminal의 서버 클라이언트 모델에서는 작동하지 않습니다.
egmont
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.