저는 GDB를 사용하려고 하다가 디버깅 중인 프로그램을 생성하려고 할 때마다 Bash가 생성된다는 것을 발견했습니다(GDB는 이라고 말하고 starting myProg...
Bash가 나타납니다. Bash를 종료하면 GDB로 돌아가서 나 Bash의 종료 상태). 처음에 나는 이것이 GDB의 이상한 문제라고 생각했지만 Vim에서 프로세스를 생성하려고 하면 Bash도 생성된다는 것을 발견했습니다.
순간적으로 영감을 받아 문제를 내 기본 셸이 Tcsh라는 사실과 연관시켰고, 이를 변경할 수 없었기 때문에 그냥 .tcshrc
contain 로 설정했습니다 exec bash
. Tcsh 로 변경하거나 bash
Tcsh를 사용하면 문제가 사라졌습니다.
나는 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
변경하지 않기 때문입니다 . 선택한 쉘을 직접 사용해야 합니다( ).SHELL
gdb
vim
tcsh
bash
노트:당신은 그것에 대해 생각할 수도 있습니다. 뭔가를 실행할 때 tcsh
... 예상대로 실행되지 않을 수도 있습니다.
답변4
내가 의심하는 것은 GDB 내에서 프로그램을 실행할 때 프로그램을 실행하기 위해 하위 쉘을 시작하여 rc 파일을 얻는다는 것입니다.
exec 매뉴얼 페이지에는 "exec() 함수 계열은 현재 프로세스 이미지를 새 프로세스 이미지로 대체합니다"라고 나와 있습니다.
내 생각에 무슨 일이 일어나고 있는지는 rc 파일에서 exec를 호출하면 bash로 실행하려고 했던 모든 것을 대체하고 종료할 때 bash 종료 코드를 사용하여 GDB로 돌아간다는 것입니다. bash와 함께 exec를 사용하고 프로그램을 실행하려면 tcsh(Bash의 argv와 동일)가 실행하려는 모든 항목에 대한 프로그램 호출을 저장하는 위치를 파악하고 이를 bash에 전달해야 할 수 있습니다.
또한 rc 파일을 좋아하고 argv를 확인하여 프로그램을 실행하려고 하는지 확인하거나 로그인 셸을 가져와 이를 기반으로 다른 동작을 수행할 수도 있습니다.