为什么我的列表没有在 .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因为您描述的行为是该 shell 的行为。

不幸的是,你的问题遗漏了一些相当关键的信息如何你正在调用脚本。有多种方法可以做到这一点,但是当从 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解释器(假设这是活动 shell)。

现在您还可以修复脚本,使其在两个 shell 中都能正常工作。解决方法是使用数组而不是字符串来存储从 中获取的值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

相关内容