Что происходит после kill -CONT ?

Разница в том, что когда вы вызываете его из командной строки, вы используете bash в качестве интерпретатора. Когда вы вызываете его из .zshrc , вы используете zsh в качестве интерпретатора. Я знаю, что вы используете zsh в качестве интерпретатора при запуске из ~ / .zshrc , потому что описываемое вами поведение является поведением этой оболочки.

К сожалению, ваш вопрос не учитывает довольно важную часть информации о , как вы вызываете сценарий. Есть несколько способов сделать это, но ни один из них не имеет различий в поведении при запуске из интерфейса командной строки или из другого скрипта (если у вас нет какой-либо эзотерической конфигурации, такой как двоичный файл bash в $ PATH , который на самом деле является zsh или какой-то другой глупостью). Некоторые распространенные способы:

  1. / путь / к / скрипту - будет использоваться интерпретатор bash .В частности, он будет использовать / bin / sh . Ваш шебанг (первая строка) сломан. Это должно быть #! / Usr / bin / env , а не # / usr / bin / env .
  2. bash / path / to / script - будет использовать интерпретатор bash .
  3. zsh / path / to / script - будет использовать интерпретатор zsh .
  4. . / path / to / script - будет использовать интерпретатор zsh (при условии, что это активная оболочка).

Теперь вы также можете просто исправить свой скрипт, чтобы он работал правильно в обеих оболочках. Исправление состоит в том, чтобы использовать массив, а не строку, для хранения значений, полученных из tmux list-sessions .

TMUX_SESSIONS=( $(tmux list-sessions -F "#S") new )
echo "${TMUX_SESSIONS[@]}"

echo "Which tmux session, or enter string for a new one";
select TMUX_SESSION in "${TMUX_SESSIONS[@]}"; do
3
08.04.2016, 01:18
1 ответ

Процесс, запущенный из оболочки, имеет связанный с ним управляющий TTY, который они наследуют от оболочки, а также принадлежат к группе процессов. При запуске нескольких процессов в канале с |или использовании нотации подоболочки с ()все эти процессы запускаются с одной и той же группой процессов. Когда пользователь нажимает клавишу приостановки, обычно Ctrl -Z с клавиатуры, уровень TTY отправляет сигнал SIGTSTPвсем процессам в текущей группе процессов переднего плана, и родительская оболочка просыпается с сообщениемSIGCHLD(или возвращает вызовwait())для повторной обработки TTY. Оболочка отвечает за контроль над тем, какая группа процессов находится на переднем плане, поскольку она управляет TTY, а сама оболочка находится в своей собственной группе процессов.

Если процесс не является частью текущей группы процессов переднего плана для TTY, он будет автоматически остановлен уровнем TTY с SIGTTINпри попытке чтения с терминала. Например, отправка SIGCONTв интерактивный текстовый редактор, такой как vim, возобновит его, но он немедленно получит SIGTTIN, как только вызовет read(), чтобы получить следующее нажатие клавиши с клавиатуры. Оболочка должна быть уведомлена с помощью директивы управления заданиями fgо том, что она должна переместить vim в группу процессов переднего плана, прежде чем возобновить ее, тем самым удаляя оболочку из переднего плана.

0
27.01.2020, 21:46

Теги

Похожие вопросы