tmux를 exec로 교체

tmux를 exec로 교체

나는 한동안 tmux를 사용해왔고 매우 만족하고 있습니다. 대부분의 경우 필요하므로 기본 셸로 설정했습니다(정확하게는 guake).

그것은 좋고 나는 그것에 매우 만족합니다.

하지만 때로는 tmux를 종료하고 깨끗한 쉘을 가져야 하지만 기본적으로 tmux를 사용하고 있으므로 세션을 종료하면 나중에 다른 tmux가 나타나게 됩니다.

그래서 내 질문은 : 교체가 가능합니까?다중화 과정주어진 쉘을 사용하시겠습니까?

exec물론 비슷한 것은 tmux 자체가 아닌 tmux 내부의 쉘을 대체하기 때문에 작동하지 않습니다.

답변1

나는 tmux가 이것을 할 수 있다고 생각하지 않습니다. C 프로그래밍을 알고 있다면 땜질하는 것이 쉬울 것입니다.

당신이 할 수 있는 한 가지는 래퍼 쉘 스크립트에서 tmux를 호출하고 스크립트가 종료할지 여부를 결정하도록 하는 것입니다. tmux가 종료될 때 대화형 셸을 실행하라는 신호를 래퍼에 보냅니다. 래퍼 스크립트에 대한 테스트되지 않은 개념 증명은 다음과 같습니다.

export TMUX_PARENT_PID=$$
trap 'exec bash -i' USR1
tmux

존재하다 ~/.tmux.conf:

update-environment DISPLAY WINDOWID SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION TMUX_PARENT_PID

tmux 내에서 분리 후 셸 프롬프트를 가져옵니다.

TMUX_PARENT_PID=$(tmux show-environment | sed -n 's/^TMUX_PARENT_PID=//p')
kill -USR1 $TMUX_PARENT_PID
tmux detach-client

답변2

tmux가 실행 중이면 환경 변수 TMUX가 설정되므로 bashrc에 이와 같은 줄을 넣으면 tmux는 여전히 셸입니다.

그러나 이미 실행 중이라면 bash 또는 다른 쉘은 잘 실행될 것입니다(chsh를 사용하여 쉘을 tmux로 설정하지 마십시오. 문제가 될 수 있습니다).

if [[ ! -z ${TMUX} ]]; then
    // run tmux
    tmux "$@"
    exit 0
fi
// tmux is already running

답변3

나는 몇 년 늦었다는 것을 알고 있지만 @Gilles의 답변을 읽은 후 신호 메커니즘을 추가하기 위해 파일을 다시 디자인하는 데 한두 시간을 보냈습니다. .profile이는 원래 질문에 더 잘 답할 수 있다고 믿습니다. 제목):

# Start tmux:
if [ -n "$(type tmux 2> /dev/null)" ] && [ -z "$TMUX" ]; then
    # Configure a signal handler to allow the tmux session to toggle the exit flag:
    export EXIT_FLAG=1
    export TMUX_PARENT_PID=$$
    trap 'EXIT_FLAG=$(($EXIT_FLAG ^ 1))' USR1

    # Start tmux:
    tmux new-session -s "shell$$" "TMUX_PARENT_PID=$$ $SHELL -l"

    # Exit, assuming the exit flag has not been flipped:
    if [ "x$EXIT_FLAG" == "x1" ]; then
        exit
    fi

    # Otherwise, cleanup the environment:
    unset EXIT_FLAG
    unset TMUX_PARENT_PID
    unset TMUX
fi

my 에서 이 명령을 사용하면 .profile모든 쉘은 기본적으로 tmux를 시작하고 tmux와 함께 종료됩니다. 쉘이 tmux 종료 후에도 유지되도록 하려면 kill -s USR1 $TMUX_PARENT_ID실행하기 전에 실행하면 exit쉘이 종료되지 않습니다.

kill ...위 명령은 실제로 변수를 전환하므로 연속 EXIT_FLAG해서 kill ...두 번 실행하면 실제로 취소됩니다.

관련 정보