
複数のタブで 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
どうやら、ディレクトリを囲む単一引用符が、スクリプト内の gnome-terminal の部分を妨害しているようです。それらを削除すると、問題は解決しました。