任何人都可以帮助解释tmux,bash和exec是怎么回事?我试图用4窗格窗口设置一个tmux会话。理想情况下,我想在3个窗格中运行命令:一个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,它停止瘦服务器并返回到shell。然而,命令不在历史中;即如果我击中向上键我没有得到包执行瘦命令…我从我的bash历史中得到一些其他命令。我想知道是否有任何方式来安排这些脚本,以便我得到的命令在bash历史。
也…我试过了许多组合的exec,exec $ SHELL -s …和exec $ SHELL -s … -I,我不知道发生了什么…
任何人都可以帮助解释什么是与tmux和bash和exec在这里的一般想法?
正如其他人提到的,在启动$ SHELL之前,您的命令由shell脚本运行;没有一般方式的$ SHELL的实例可以知道它的父运行之前启动它。
要将“初始命令”导入shell历史记录,需要将命令键击直接提供给$ SHELL本身的实例(当然,它已经启动)。在其他情况下,我可能建议使用一个小的Expect程序产生一个$ SHELL的实例,喂它的击键,然后使用交互将tty绑定到期望产生的$ 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