
我有一個腳本來啟動帶有多個選項卡的 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 部分。刪除它們解決了問題。