誰がtmux
、bash
、およびexec
で何が起こっているのか説明できますか? 4ペインウィンドウでtmuxセッションを設定しようとしています。理想的には、3つのペインでコマンドを実行したいと思います。 a Ruby ThinサーバーといくつかのRubyデーモン。これは私がこれまで持っているものです。
_~/.bin/tmux-foo
_:
_#!/bin/sh
tmux new-session -d -s foo 'exec pfoo "bundle exec thin start"'
tmux rename-window 'Foo'
tmux select-window -t foo:0
tmux split-window -h 'exec pfoo "bundle exec compass watch"'
tmux split-window -v -t 0 'exec pfoo "rake ts:start"'
tmux split-window -v -t 1 'exec pfoo'
tmux -2 attach-session -t foo
_
_~/.bin/pfoo
_:
_#!/bin/bash
cd ~/projects/foo
rvm use ree
# here I want to execute command1 2 3 or 4...
exec $Shell
_
それはすべて機能します...しかし、シンサーバーを実行している最初のペインで_ctlr-c
_すると、シンサーバーを停止してシェルに戻ります。ただし、コマンドは履歴にはありません。つまり、上キーを押しても_bundle exec thin start
_コマンドを取得できません... bash履歴から他のコマンドを取得します。これらのスクリプトを整理して、bash履歴にコマンドを取得する方法があるかどうか疑問に思っています。
また... exec
、_exec $Shell -s ...
_、_exec $Shell -s ... -I
_の多くの組み合わせを試しましたが、何が起こっているのかよくわかりません...
ここでtmux
とbash
とexec
で何が起こっているかの一般的なアイデアを説明するのを手伝ってもらえますか?
他の人が述べたように、コマンドはシェルスクリプトによって実行されていますbefore$Shell
;を起動します; $Shell
のインスタンスが、起動する前に親が何を実行したかを知る一般的な方法はありません。
「初期コマンド」をシェルの履歴に入れるには、コマンドキーストロークを$Shell
自体のインスタンスに直接供給する必要があります(もちろん、開始後)。他のコンテキストでは、小さなExpectプログラムを使用して$Shell
のインスタンスを生成し、それにキーストロークを供給し、interact
を使用してttyをexpect-に結び付けることをお勧めします。 $Shell
が生成されました。
ただし、tmuxのコンテキストでは、send-keys
を使用できます。
#!/bin/sh
tmux new-session -d -s foo 'exec pfoo'
tmux send-keys 'bundle exec thin start' 'C-m'
tmux rename-window 'Foo'
tmux select-window -t foo:0
tmux split-window -h 'exec pfoo'
tmux send-keys 'bundle exec compass watch' 'C-m'
tmux split-window -v -t 0 'exec pfoo'
tmux send-keys 'rake ts:start' 'C-m'
tmux split-window -v -t 1 'exec pfoo'
tmux -2 attach-session -t foo
tmuxinator では、これをNice yamlファイルで指定できます。あなたの場合、あなたが持つことができます:
# ~/.tmuxinator/foo.yml
# you can make as many tabs as you wish...
project_name: foo
project_root: ~/projects/foo
rvm: ree
tabs:
- main:
layout: tiled
panes:
- bundle exec thin start
- bundle exec compass watch
- #empty, will just run plain bash
- rake ts:start
もちろん、追加のウィンドウなどを持つことができます。
コマンドを実行してから、対話型シェルに入ります。対話型のシェルではなく、スクリプトから実行されたコマンドは履歴に記録されません。シェルの入力をTIOCSTI
for "terminal ioctl():stuff input")であったウィンドウに詰め込む方法(技術用語:)が本当に必要です。
tmux
を使用すると、バッファを使用するように見えます。 (未検証)の線に沿った何か
#! /bin/bash
cd ~/projects/foo
rvm use ree
if [[ $# != 0 ]]; then
tmux set-buffer "$(printf '%s\n' "$*")" \; paste-buffer -d
fi
exec ${Shell:-/bin/sh}