コマンドラインから呼び出すと正しく機能する次のスクリプトがありますが、ファイルから呼び出すとセッション~/.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や他のスクリプトで実行してもどちらも機能しません(実際には1つまたは他の愚かな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
(アクティブシェルであると仮定)。
両方のシェルで正しく機能するようにスクリプトを変更することもできます。解決策は、文字列の代わりに配列を使用して取得した値を保存することです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