Bash脚本与tmux启动一个4窗口的窗口
任何人都可以帮忙解释一下tmux
, bash
和exec
怎么回事? 我试图设置一个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历史中获得命令。
另外…我已经尝试了exec
, exec $SHELL -s ...
和exec $SHELL -s ... -I
许多组合,我也不太清楚发生了什么事情…
任何人都可以帮忙解释一下tmux
和bash
以及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}