我有以下脚本,当从命令行调用时可以正常工作,但是当我从文件中调用该脚本时,~/.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
二进制文件)。一些常见的方式:$PATH
zsh
/path/to/script
- 将使用bash
口译员。更具体地说,它将使用/bin/sh
.你的 shebang(第一行)坏了。必须是#!/usr/bin/env
,不是#/usr/bin/env
。bash /path/to/script
- 将使用bash
口译员。zsh /path/to/script
- 将使用zsh
口译员。. /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