我有一个脚本来启动带有多个选项卡的 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
使用数组来存储单独的参数。当 shell 稍后尝试用空格分割字符串时,使用字符串会使 shell 感到困惑。
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
目录周围的单引号显然会干扰脚本内的 gnome-terminal 部分。删除它们解决了问题。