Bash脚本与tmux启动一个4窗口的窗口

任何人都可以帮忙解释一下tmuxbashexec怎么回事? 我试图设置一个4窗格的tmux会话。 理想情况下,我想在三个窗格中运行一个命令:例如一个Ruby瘦服务器和一对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时,它会停止瘦服务器并返回到shell。 但是,这个命令并不在历史中, 即如果我打了向上的键,我没有得到bundle exec thin start命令…我从我的bash历史中得到一些其他的命令。 我想知道是否有任何方法来安排这些脚本,以便我在bash历史中获得命令。

另外…我已经尝试了execexec $SHELL -s ...exec $SHELL -s ... -I许多组合,我也不太清楚发生了什么事情…

任何人都可以帮忙解释一下tmuxbash以及exec吗?

正如其他人所提到的, 启动$SHELL 之前 ,您的命令将由shell脚本运行; 没有一般的方法$SHELL的实例可以知道它的父母在启动之前运行的是什么。

为了让“初始命令”进入shell历史logging,你需要直接将命令按键提供给$SHELL本身的实例(当然它已经启动了)。 在其他情况下,我可能会build议使用一个小型的Expect程序来产生一个$SHELL的实例,给它提供击键,然后使用interact来将tty绑定到期望已经分配的$SHELL

但是在tmux的情况下,我们可以使用send-keys

 #!/bin/sh tmux new-session -d -s foo 'exec pfoo' tmux send-keys 'bundle exec thin start' 'Cm' tmux rename-window 'Foo' tmux select-window -t foo:0 tmux split-window -h 'exec pfoo' tmux send-keys 'bundle exec compass watch' 'Cm' tmux split-window -v -t 0 'exec pfoo' tmux send-keys 'rake ts:start' 'Cm' tmux split-window -v -t 1 'exec pfoo' tmux -2 attach-session -t foo 

tmuxinator让你指定一个不错的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 

你当然可以有额外的窗户等

您正在运行该命令,然后进入交互式shell; 从脚本运行的命令不在交互式shell中,不会logging在历史logging中。 你真的想要一个方法来(这是一个技术术语:)曾经是TIOCSTI为“terminalioctl():东西input”)input到shell的窗口。

使用tmux ,它看起来像你使用缓冲区。 (未经testing的)

 #! /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}