여러 탭이 있는 gnome 터미널을 시작하는 스크립트가 있습니다. 이러한 탭은 .tabs
스크립트와 동일한 디렉터리에 있는 파일에 나열된 디렉터리 목록을 기반으로 열립니다.
--tabs --working-directory /some/dir
탭 파일의 각 줄에 대해 여러 문자열을 포함하는 문자열을 만듭니다.
명령을 실행하기 전에 명령을 콘솔에 표시합니다. 그런 다음 실제로 실행합니다. 문제는 gnome이 탭을 열지만 작업 디렉토리의 모든 탭을 열지는 않는다는 것입니다. 하지만 인쇄된 내용을 복사하여 콘솔에 붙여넣으면 제대로 작동합니다. 이유를 모르겠습니다.
스크립트는 다음과 같습니다.
#!/bin/bash
SCRIPT_DIR=$(dirname $(readlink -f $0))
declare -a profiles_list=()
while [[ "$1" != "" ]]
do
profiles_list+=($1)
shift
done
if [[ ${#profiles_list[@]} -eq 0 ]]
then
profiles_list+=("TERM_DEFAULT")
fi
TERM_LIST_PARAM=""
for profile in ${profiles_list[@]}
do
file="${SCRIPT_DIR}/${profile}.tabs"
if [[ ! -f $file ]]
then
echo $file does not exists
fi
while read tab
do
tab_line="--tab --working-directory='${tab}'"
TERM_LIST_PARAM="$tab_line $TERM_LIST_PARAM"
done < $file
done
echo gnome-terminal ${TERM_LIST_PARAM}
gnome-terminal -v ${TERM_LIST_PARAM}
echo $?
exit 0
답변1
개별 매개변수를 저장하려면 배열을 사용하세요. 문자열을 사용하면 나중에 문자열을 공백으로 분할하려고 할 때 쉘이 혼동됩니다.
TERM_LIST_PARAM=( )
이어서,
tab_line=( --tab --working-directory="$tab" )
TERM_LIST_PARAM=( "${tab_line[@]}" "${TERM_LIST_PARAM[@]}" ) # or: TERM_LIST_PARAM+=( "${tab_line[@]}" )
그 다음에,
gnome-terminal -v "${TERM_LIST_PARAM[@]}"
또한 코드에 큰따옴표 $0
, $1
, $file
및를 사용해야 합니다 ${profiles_list[@]}
. 그렇지 않으면 이러한 값에 공백 및/또는 와일드카드가 포함되어 있으면 문제가 발생합니다.
또한보십시오:
답변2
디렉토리 주변의 작은따옴표는 분명히 스크립트 내부의 그놈 터미널 부분을 방해합니다. 이를 제거하면 문제가 해결되었습니다.