在 bash 腳本中執行 tmux 中的函數

在 bash 腳本中執行 tmux 中的函數

我的 bash 腳本有一些函數,我需要一個 tmux 窗格來執行 bash 腳本中的函數。例如,下面的程式碼將不起作用,並且會報告找不到命令“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

我編寫了一個 bash 函數,它接受一個函數作為參數,並使用「send-keys」將其載入到 tmux 會話中。顯然,當此函數運行時,接收 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

據我所知,您無法將 shell 函數匯出到 tmux 實例。至少在 1.9 版本的 tmux 手冊頁中沒有提到它。

我認為這是不可能的,因為建立 tmux 會話的腳本上下文與 tmux 會話中的上下文完全不同。因此它甚至無法了解這些功能。此外,tmux 甚至可能使用與您正在使用的 shell 不同的 shell。

但是,為了提供一些替代方案,您可以執行以下操作之一:

  1. 編寫另一個腳本,將您的internal函數放入其中並使用它。
  2. 寫一個圖書館包含所有功能但僅此而已的腳本,source該庫腳本位於應用腳本,以便其功能在那裡可用,並使用這些應用程式腳本。

第二個選項還為您提供了更多的代碼衛生和更好的可重複使用性。

相關內容