bash スクリプト内で tmux 関数を実行する

bash スクリプト内で tmux 関数を実行する

私の bash スクリプトにはいくつかの関数があり、bash スクリプト内で関数を実行するには 1 つの tmux ペインが必要です。たとえば、以下のコードは機能せず、コマンド「internal」が見つからないという報告が表示されます。

common() {
internal() {
echo "Function executed"
}   

SESSIONNAME="ses"

tmux new-session -s $SESSIONNAME -n session -d
tmux split-window -t $SESSIONNAME:0 -h

tmux send-keys 'internal' 'C-m'
tmux select-window -t $SESSIONNAME:0
tmux attach -t $SESSIONNAME
}

では、tmux ペインが呼び出されたスクリプトから関数を実行するように tmux に指示するにはどうすればよいでしょうか?

答え1

私は関数を引数として受け取り、'send-keys' を使用して tmux セッションにロードする bash 関数を作成しました。当然、この関数が実行されるときには、受信側の tmux ペインで bash またはそれと互換性のあるものが実行されている必要があります。

_pass_to_tmux() {
    _FUNC_TO_PASS="${1}"
    _IFS_BACKUP="${IFS}"
    IFS=$'\n'
    for i in $(type ${_FUNC_TO_PASS} | tail -n +2); do
        tmux send-keys "${i}" C-m
    done 
    IFS="${_IFS_BACKUP}"
}

答え2

私の知る限り、シェル関数を tmux インスタンスにエクスポートすることはできません。少なくとも tmux のマニュアル ページのバージョン 1.9 には、それに関する言及はありません。

tmux セッションを作成しているスクリプトのコンテキストは、tmux セッション内のコンテキストとはまったく異なるため、これはまったく不可能だと思います。したがって、これらの関数を認識することすらできません。また、tmux は、使用しているシェルとは異なるシェルを使用する可能性もあります。

ただし、いくつかの代替案を提供するために、次のいずれかを実行できます。

  1. 別のスクリプトを書いて、internalそこに関数を入れて、代わりにそれを使用します。
  2. 書く図書館関数だけを含むスクリプト、sourceそのライブラリスクリプトは応用スクリプトを作成してその関数がそこで利用できるようにするので、代わりにこれらのアプリケーション スクリプトを使用します。

2 番目の選択肢では、コードの衛生状態が向上し、再利用性も向上します。

関連情報