.zshrc 시작 스크립트에서 내 목록이 배열로 변환되지 않는 이유는 무엇입니까?

.zshrc 시작 스크립트에서 내 목록이 배열로 변환되지 않는 이유는 무엇입니까?

명령줄에서 호출하면 제대로 작동하는 다음 스크립트가 있지만 파일에서 호출하면 ~/.zshrc세션 목록이 배열로 변환되지 않습니다.

#/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

수동으로 실행하면 출력이 (예상대로)...

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

런타임 출력~/.zshrc

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

이것은 참고용으로 Mac에 있습니다.

답변1

차이점은 명령줄에서 호출할 때 bash인터프리터 역할을 한다는 것입니다. 통역사를 통해 전화할 때 .zshrc. 당신이 설명하는 동작은 해당 쉘의 동작이기 때문에 런타임에 인터프리터를 사용하고 있다는 zsh것을 알고 있습니다 .zsh~/.zshrc

안타깝게도 귀하의 질문에는 매우 중요한 정보가 빠져 있습니다.어떻게스크립트를 호출하고 있습니다. 이를 수행하는 방법은 여러 가지가 있지만 CLI나 다른 스크립트에서 실행할 때 그 중 어느 것도 다르게 작동하지 않습니다(실제로 하나 또는 다른 어리석은 bash바이너리 와 같은 난해한 구성이 없는 한 ). 몇 가지 일반적인 방법:$PATHzsh

  1. /path/to/script- bash통역사가 사용됩니다. 보다 구체적으로는 를 사용합니다 /bin/sh. Shebang(첫 번째 줄)이 깨졌습니다. 그래야 합니다 #!/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

관련 정보