-i
аргументом sed является расширение GNU. Вы, вероятно, не выполняете GNU sed, который является, почему Вы получаете ошибку о -i
быть нераспознанным.
Я не думаю, что 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
Если tmux будет работать, то переменная среды, TMUX был бы установлен, таким образом путем помещения строк как это в bashrc, tmux, все еще будет оболочкой.
Но если бы это уже работает, удар или другая оболочка обычно работали бы, (не используйте chsh для установки оболочки на tmux, который может быть проблемой),
if [[ ! -z ${TMUX} ]]; then
// run tmux
tmux "$@"
exit 0
fi
// tmux is already running
Я знаю, что опоздал на вечеринку на несколько лет, но, прочитав ответ @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
При этом в моем .profile
все оболочки будут запускать tmux по умолчанию, а также завершать работу с tmux. Если я хочу, чтобы оболочка осталась после выхода из tmux, мне просто нужно запустить kill -s USR1 $TMUX_PARENT_ID
перед запуском exit
, и оболочка не выйдет.
Обратите внимание, что приведенная выше команда kill...
на самом деле переключает переменную EXIT_FLAG
, поэтому запуск kill...
два раза подряд эффективно отменяет сам себя.