谁能帮忙解释一下 tmux
、bash
和 exec
是怎么回事?我正在尝试使用 4 Pane 窗口设置 tmux session 。理想情况下,我想在其中 3 个 Pane 中运行命令:例如一个 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
一切正常...但是当我在运行瘦服务器的第一个 Pane 中 ctlr-c
时,它会停止瘦服务器并返回到 shell。但是,该命令不在历史记录中;也就是说,如果我按下向上键,我不会得到 bundle exec thin start
命令...我从我的 bash 历史记录中得到了一些其他命令。我想知道是否有任何方法可以安排这些脚本,以便我在 bash 历史记录中获取命令。
此外...我已经尝试了exec
、exec $SHELL -s ...
和exec $SHELL -s .. .-我
而且我不太确定发生了什么......
任何人都可以在这里帮助解释 tmux
和 bash
和 exec
发生了什么的一般想法吗?
最佳答案
正如其他人所提到的,您的命令在 启动您的 $SHELL
之前由 shell 脚本运行; $SHELL
的实例无法知道其父级在启动之前运行了什么。
要将“初始命令”放入 shell 历史记录中,您需要将命令击键直接提供给 $SHELL
本身的实例(当然是在它启动之后)。在其他情况下,我可能建议使用一个小的 Expect 程序来生成 $SHELL
的实例,向它提供击键,然后使用 interact
将 tty 绑定(bind)到 expect-spawned $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
关于使用 tmux 的 Bash 脚本来启动一个 4 Pane 的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5447278/