Jalankan fungsi di tmux dalam skrip bash

2

Script bash saya memiliki beberapa fungsi dan saya memerlukan satu panel tmux untuk menjalankan fungsi dalam skrip bash. Misalnya kode di bawah ini tidak akan berfungsi dan akan dilaporkan bahwa perintah "internal" tidak ditemukan.

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
}

Jadi bagaimana saya bisa memberitahu tmux untuk menjalankan fungsi dari skrip tempat tmux pane dipanggil?

Demontager
sumber

Jawaban:

1

Sejauh yang saya tahu, Anda tidak dapat mengekspor fungsi shell ke instance tmux. Setidaknya dalam versi 1.9 dari halaman manual tmux tidak ada referensi untuk itu.

Saya kira ini tidak mungkin sama sekali karena konteks skrip tempat Anda membuat sesi tmux sepenuhnya berbeda dari konteks dalam sesi tmux. Dengan demikian bahkan tidak dapat memiliki pengetahuan tentang fungsi-fungsi ini. Juga, tmux bahkan mungkin menggunakan shell yang berbeda dari yang Anda gunakan.

Namun, untuk memberikan beberapa alternatif, yang dapat Anda lakukan adalah salah satu dari:

  1. Tulis skrip lain, masukkan internalfungsi Anda di dalamnya dan gunakan itu.
  2. Tulis skrip pustaka yang berisi semua fungsi Anda tetapi tidak ada yang lain, sourceskrip pustaka tersebut dalam skrip aplikasi sehingga fungsinya tersedia di sana dan gunakan skrip aplikasi ini sebagai gantinya.

Alternatif kedua juga memberi Anda lebih banyak kode kebersihan dan penggunaan kembali yang lebih baik.

Christian Krause
sumber
0

Saya menulis fungsi bash yang mengambil fungsi sebagai argumen dan memuatnya ke sesi tmux menggunakan 'send-keys'. Jelas panel tmux penerima harus menjalankan bash atau sesuatu yang kompatibel ketika fungsi ini berjalan.

_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}"
}
Ryan White
sumber