Por que minha lista não está sendo convertida em uma matriz no script de inicialização .zshrc?

2

Eu tenho o seguinte script que funciona bem quando chamado na linha de comando, no entanto, quando eu chamo o script de dentro do meu arquivo ~/.zshrc , a lista de sessões não é convertida em uma matriz.

#/usr/bin/env bash

# Get tmux sessions and add option for a new one
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
  case $TMUX_SESSION in
    new )
      while [[ "${TMUX_SESSION}" == "new" || "${TMUX_SESSION}" == "" ]]; do
        read -p "Session name: " TMUX_SESSION
        echo "\"${TMUX_SESSION}\""
      done
      tmux new -s ${TMUX_SESSION}
      ;;
    * )
      tmux attach -t ${TMUX_SESSION}
  esac

  break
done

Saída quando eu corro manualmente (como esperado)…

api base limtool new
Which tmux session, or enter string for a new one
1) api
2) base
3) limtool
4) new

Saída quando executado a partir de ~/.zshrc

api
base
limtool   new
Which tmux session, or enter string for a new one
1) api
base
limtool   new

Isso está no Mac, como referência.

    
por TobyG 11.03.2017 / 12:15

1 resposta

2

A diferença é que quando você chama a partir da linha de comando, você está usando bash como o interpretador. Quando você chama de .zshrc , você está usando zsh como o interpretador. Eu sei que você está usando zsh como o intérprete ao correr de ~/.zshrc porque o comportamento que você descreve é o comportamento daquele shell.

Infelizmente, sua pergunta deixa de fora uma informação bastante crítica sobre como você está chamando o script. Há várias maneiras de fazer isso, mas nenhuma delas tem diferença de comportamento quando executada a partir da CLI ou de outro script (a menos que você tenha alguma configuração esotérica, como bash binary em $PATH , que na verdade é zsh ou alguma outra tolice). Algumas formas comuns:

  1. /path/to/script - usará o interpretador bash . Mais especificamente, usará /bin/sh . Seu shebang (a primeira linha) está quebrado. Precisa ser #!/usr/bin/env , não #/usr/bin/env .
  2. bash /path/to/script - usará bash intérprete.
  3. zsh /path/to/script - usará zsh intérprete.
  4. . /path/to/script - usará o interpretador zsh (supondo que seja o shell ativo).

Agora você também pode consertar seu script para que ele funcione corretamente em ambos os shells. A correção é usar uma matriz, e não uma string, para armazenar os valores obtidos de 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
    
por 11.03.2017 / 16:50

Tags