.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や他のスクリプトで実行してもどちらも機能しません(実際には1つまたは他の愚かな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

おすすめ記事