명령줄에서 호출하면 제대로 작동하는 다음 스크립트가 있지만 파일에서 호출하면 ~/.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
바이너리 와 같은 난해한 구성이 없는 한 ). 몇 가지 일반적인 방법:$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