任何人都可以帮助解释这是怎么回事用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
Run Code Online (Sandbox Code Playgroud)
~/.bin/pfoo:
#!/bin/bash
cd ~/projects/foo
rvm use ree
# here I want to execute command1 2 3 or 4...
exec $SHELL
Run Code Online (Sandbox Code Playgroud)
一切正常......但是当我ctlr-c在运行瘦服务器的第一个窗格中时,它会停止瘦服务器并返回到shell.但是,该命令不在历史中; 即如果我按下向上键我没有得到bundle exec thin start命令......我从我的bash历史中得到了一些其他命令.我想知道是否有任何方法来安排这些脚本,以便我在bash历史记录中获取命令.
此外...我已经尝试的多种组合exec,exec $SHELL -s ...和exec $SHELL -s ... -I我不太清楚什么是要去...
谁能帮忙解释一下是怎么回事的总体思路tmux,并bash和exec这里?
Chr*_*sen 61
正如其他人所提到的,在启动你的命令之前,你的命令是由shell脚本运行的$SHELL; $SHELL在启动它之前,没有通用的方法可以知道它的父运行了什么.
要将"初始命令"放入shell历史记录中,您需要将命令键击直接提供给$SHELL它自己的实例(当然,在它启动之后).在其他情况下,我可能会建议使用一个小的Expect程序来生成一个实例$SHELL,给它提供击键,然后interact用来将tty绑定到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
Run Code Online (Sandbox Code Playgroud)
Ham*_*ner 15
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
Run Code Online (Sandbox Code Playgroud)
你当然可以有额外的窗户等.
将以下内容放入命令提示符中[全部作为一行],它将自动打开 4 个 tmux 面板(我知道这不是问题,但这看起来比我看到的发布要容易一些):
tmux new-session \; \split-window -v \; \split-window -h \; \select-pane -t 0 \; \split-window -h
Run Code Online (Sandbox Code Playgroud)
现在您可以采用该命令并将其与您喜欢的任何脚本语言一起使用[如果使用 perl...并且可能还有其他语言,则需要将转义字符 {反斜杠字符} 加倍]。
这将在较新的 tmux 面板中运行后续命令,恢复到第一个命令并在最后将其拆分。