모든 하위 프로세스는 Bash(!)입니다.

모든 하위 프로세스는 Bash(!)입니다.

저는 GDB를 사용하려고 하다가 디버깅 중인 프로그램을 생성하려고 할 때마다 Bash가 생성된다는 것을 발견했습니다(GDB는 이라고 말하고 starting myProg...Bash가 나타납니다. Bash를 종료하면 GDB로 돌아가서 나 Bash의 종료 상태). 처음에 나는 이것이 GDB의 이상한 문제라고 생각했지만 Vim에서 프로세스를 생성하려고 하면 Bash도 생성된다는 것을 발견했습니다.

순간적으로 영감을 받아 문제를 내 기본 셸이 Tcsh라는 사실과 연관시켰고, 이를 변경할 수 없었기 때문에 그냥 .tcshrccontain 로 설정했습니다 exec bash. Tcsh 로 변경하거나 bashTcsh를 사용하면 문제가 사라졌습니다.

나는 Tcsh가 어떻게 내 문제를 일으키는지 전혀 모릅니다. 누구든지 정보를 제공할 수 있나요?


그건 그렇고, 그냥 .NET PATH="" /usr/bin/gdb대신 GDB를 실행함으로써 그렇게 할 수 있었습니다 gdb.bash: command not found

답변1

다른 답변에는 좋은 설명이 있습니다.

해결책으로 나는 export SHELL=bash명령을 생성하는 데 사용할 쉘을 결정하기 위해 이 변수를 사용하도록 gdb 또는 screen과 같은 많은 명령을 설정했습니다.

따라서 bash만 시작하도록 구성된 tcsh 대신 bash를 직접 사용하여 명령을 생성하십시오.


SSH 키를 사용하여 서버에 로그인하고 Authorized_keys 파일의 키에 강제 명령을 추가하면 설정을 개선할 수 있습니다.

이렇게 하면 tcsh 스크립트를 손상시키지 않고 bash에서 직접 시작할 수 있습니다.

답변2

.tcshrc 파일에서 exec bash다음과 같이 래핑할 수 있습니다.

if ($?prompt) then
    exec /path/to/bash
endif

$?prompt비대화형 쉘에서는 false이므로 대화형 세션이 있는 경우에만 bash를 사용하십시오.

답변3

나는 명백한 이유가 gdb프로세스를 생성하기 위해 쉘을 사용하고 있다고 생각합니다.

Vim이 해냅니다 ( help !)

:!{cmd}         Execute {cmd} with the shell.

:!ls -l따라서 Vim이 실제로 실행될 것이라고 말하면

$ SHELL -c 'ls -l'

내 생각엔 (내가 당신의 말을 이해한다는 점에서)해커 스타일올바르게 설정하십시오) exec bash -l대신 을 수행하면 쉽게 수정할 수 있습니다 exec bash.

그 이유는 (로그인 쉘이 아님) 나중에 로그인 쉘( )에서 사용 하고 이를 가리키는 환경 변수를 exec bash변경하지 않기 때문입니다 . 선택한 쉘을 직접 사용해야 합니다( ).SHELLgdbvimtcshbash

노트:당신은 그것에 대해 생각할 수도 있습니다. 뭔가를 실행할 때 tcsh... 예상대로 실행되지 않을 수도 있습니다.

답변4

내가 의심하는 것은 GDB 내에서 프로그램을 실행할 때 프로그램을 실행하기 위해 하위 쉘을 시작하여 rc 파일을 얻는다는 것입니다.

exec 매뉴얼 페이지에는 "exec() 함수 계열은 현재 프로세스 이미지를 새 프로세스 이미지로 대체합니다"라고 나와 있습니다.

내 생각에 무슨 일이 일어나고 있는지는 rc 파일에서 exec를 호출하면 bash로 실행하려고 했던 모든 것을 대체하고 종료할 때 bash 종료 코드를 사용하여 GDB로 돌아간다는 것입니다. bash와 함께 exec를 사용하고 프로그램을 실행하려면 tcsh(Bash의 argv와 동일)가 실행하려는 모든 항목에 대한 프로그램 호출을 저장하는 위치를 파악하고 이를 bash에 전달해야 할 수 있습니다.

또한 rc 파일을 좋아하고 argv를 확인하여 프로그램을 실행하려고 하는지 확인하거나 로그인 셸을 가져와 이를 기반으로 다른 동작을 수행할 수도 있습니다.

관련 정보