Разница в том, что когда вы вызываете его из командной строки, вы используете bash
в качестве интерпретатора. Когда вы вызываете его из .zshrc
, вы используете zsh
в качестве интерпретатора. Я знаю, что вы используете zsh
в качестве интерпретатора при запуске из ~ / .zshrc
, потому что описываемое вами поведение является поведением этой оболочки.
К сожалению, ваш вопрос не учитывает довольно важную часть информации о , как вы вызываете сценарий. Есть несколько способов сделать это, но ни один из них не имеет различий в поведении при запуске из интерфейса командной строки или из другого скрипта (если у вас нет какой-либо эзотерической конфигурации, такой как двоичный файл bash
в $ PATH
, который на самом деле является zsh
или какой-то другой глупостью). Некоторые распространенные способы:
/ путь / к / скрипту
- будет использоваться интерпретатор bash
.В частности, он будет использовать / bin / sh
. Ваш шебанг (первая строка) сломан. Это должно быть #! / Usr / bin / env
, а не # / usr / bin / env
. bash / path / to / script
- будет использовать интерпретатор bash
. zsh / path / to / script
- будет использовать интерпретатор zsh
. . / 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
Процесс, запущенный из оболочки, имеет связанный с ним управляющий TTY, который они наследуют от оболочки, а также принадлежат к группе процессов. При запуске нескольких процессов в канале с |
или использовании нотации подоболочки с ()
все эти процессы запускаются с одной и той же группой процессов. Когда пользователь нажимает клавишу приостановки, обычно Ctrl -Z с клавиатуры, уровень TTY отправляет сигнал SIGTSTP
всем процессам в текущей группе процессов переднего плана, и родительская оболочка просыпается с сообщениемSIGCHLD
(или возвращает вызовwait()
)для повторной обработки TTY. Оболочка отвечает за контроль над тем, какая группа процессов находится на переднем плане, поскольку она управляет TTY, а сама оболочка находится в своей собственной группе процессов.
Если процесс не является частью текущей группы процессов переднего плана для TTY, он будет автоматически остановлен уровнем TTY с SIGTTIN
при попытке чтения с терминала. Например, отправка SIGCONT
в интерактивный текстовый редактор, такой как vim, возобновит его, но он немедленно получит SIGTTIN
, как только вызовет read()
, чтобы получить следующее нажатие клавиши с клавиатуры. Оболочка должна быть уведомлена с помощью директивы управления заданиями fg
о том, что она должна переместить vim в группу процессов переднего плана, прежде чем возобновить ее, тем самым удаляя оболочку из переднего плана.