如何编写启动 tmux 会话的 shell 脚本,然后运行 ruby 脚本
How to write a shell script that starts tmux session, and then runs a ruby script
我想编写一个 shell 脚本来执行此操作:
- 首先,创建一个 tmux 会话
- 其次,运行 在 tmux 会话中 ruby 调用 "run.rb" 的脚本
在伪代码中,我想做的是:
tmux new -s my_session
ruby run.rb # NOTE: I want this to run inside the my_session tmux session.
tmux detach
我该怎么做? (我读的帖子越多,就越混乱。)
#!/bin/bash
tmux new-session -d -s my_session 'ruby run.rb'
创建一个名为my_script.sh
的文件,并给它上面的内容。
通过 运行ning 使文件可执行:
chmod 755 my_script.sh
要么
chmod +x my_script.sh
然后 运行 shell 脚本:
./my_script.sh
使 shell 脚本可执行
当您执行 chmod 755 filename
命令时,您允许所有人读取和执行文件,并且文件所有者也可以写入文件。对于 Perl 和其他应该通过网络服务器 运行 的脚本,您可能需要这个。如果你对一个目录应用755,就意味着每个人都可以进入它并获得它的文件列表。
这些权限通常被翻译成 rwxr-xr-x
的文本表示。
您也可以对文件使用 chmod +x file_name
使其可执行。
您可以使用 teamocil 轻松完成此操作。您可以只创建一个 YAML 文件:
windows:
- name: rubysession
root: ~
layout: tiled
panes:
- ruby run.rb; tmux detach
如果您将其命名为 'rubysession.yml' 那么 运行:
teamocil rubysession
这将非常适合您的目的并且不需要修改。 teamocil 也非常适合大量其他用途!
K M Rakibul Islam 的更新代码在末尾包含一个不必要的分离命令,这会导致错误消息 "no client found"(my_session 已经分离,因此不在范围内,因此 tmux 无法理解您要分离哪个会话)。正确的代码应该是:
#!/bin/bash
tmux new-session -d -s my_session 'ruby run.rb'
如果你想在启动一些命令后让你的 tmux 会话保持活动状态,一个可能的解决方案是使用初始化文件启动 bash:
tmux new -d -s mysession "bash --init-file foo.script"
其中 foo.script 将包含您的命令。或者,您可以直接从命令行将命令提供给 shell:
tmux new -d -s mysession2 "bash --init-file <(echo ruby run.rb)"
请注意 --init-file 用于读取系统范围的初始化文件,例如 /etc/bash.bashrc,因此您可能希望在脚本中 'source' 这些文件。
我不确定这对你来说是否仍然有趣,但我想给你一个答案/提示:如果你想要,例如,通过 shell 脚本启动多个 tmux 会话并执行一些命令,你可以这样做:
# just for test and show case
mkdir test_1 test_2
echo "current tmux sessions"
tmux ls
echo "kill all tmux sessions"
tmux kill-server
declare -a directories=("test_1" "test_2")
for i in "${directories[@]}"
do
cd ${i}
pwd
tmux new -d -s ${i} "ls -la"
cd ..
done
为了演示,脚本将创建文件夹 test_1 和 test_2。之后,我通过这两个文件夹定义了一个包含两个文件夹和 运行 的数组,并使用当前文件夹名称启动 tmux 会话并执行命令 "ls -la".
如果您想 运行 浏览当前目录中的所有子目录,请将 "for i in "${directories[@]}" 替换为 "for f in *; do"。这是一个示例还排除符号文件夹:
echo "current tmux sessions"
tmux ls
echo "kill all tmux sessions"
tmux kill-server dependencies
for f in *; do
if [[ -d "$f" && ! -L "$f" ]]; then
cd ${f}
pwd
tmux new -d -s ${i} "ls -la"
cd ..
fi
done
这是要点文件的 link:https://gist.github.com/AICDEV/cf1497793bb1c27cb9b94d56c209ad6f
通过一些实验,我想出了如何通过 shell 脚本控制 tmux。
tmux new-session -d -s htop-session 'htop'; # start new detached tmux session, run htop
tmux split-window; # split the detached tmux session
tmux send 'htop -t' ENTER; # send 2nd command 'htop -t' to 2nd pane. I believe there's a `--target` option to target specific pane.
tmux a; # open (attach) tmux session.
以上将 tmux 会话分成两个 window,并且 运行s htop
在两个中。
要回答原始问题,您可以 运行 一个 ruby 脚本,而不是使用以下命令分离 tmux 会话:
tmux new-session -s ruby_session 'ruby run.rb'; # open tmux session and run ruby script.
我想编写一个 shell 脚本来执行此操作:
- 首先,创建一个 tmux 会话
- 其次,运行 在 tmux 会话中 ruby 调用 "run.rb" 的脚本
在伪代码中,我想做的是:
tmux new -s my_session
ruby run.rb # NOTE: I want this to run inside the my_session tmux session.
tmux detach
我该怎么做? (我读的帖子越多,就越混乱。)
#!/bin/bash
tmux new-session -d -s my_session 'ruby run.rb'
创建一个名为
my_script.sh
的文件,并给它上面的内容。通过 运行ning 使文件可执行:
chmod 755 my_script.sh
要么chmod +x my_script.sh
然后 运行 shell 脚本:
./my_script.sh
使 shell 脚本可执行
当您执行 chmod 755 filename
命令时,您允许所有人读取和执行文件,并且文件所有者也可以写入文件。对于 Perl 和其他应该通过网络服务器 运行 的脚本,您可能需要这个。如果你对一个目录应用755,就意味着每个人都可以进入它并获得它的文件列表。
这些权限通常被翻译成 rwxr-xr-x
的文本表示。
您也可以对文件使用 chmod +x file_name
使其可执行。
您可以使用 teamocil 轻松完成此操作。您可以只创建一个 YAML 文件:
windows:
- name: rubysession
root: ~
layout: tiled
panes:
- ruby run.rb; tmux detach
如果您将其命名为 'rubysession.yml' 那么 运行:
teamocil rubysession
这将非常适合您的目的并且不需要修改。 teamocil 也非常适合大量其他用途!
K M Rakibul Islam 的更新代码在末尾包含一个不必要的分离命令,这会导致错误消息 "no client found"(my_session 已经分离,因此不在范围内,因此 tmux 无法理解您要分离哪个会话)。正确的代码应该是:
#!/bin/bash
tmux new-session -d -s my_session 'ruby run.rb'
如果你想在启动一些命令后让你的 tmux 会话保持活动状态,一个可能的解决方案是使用初始化文件启动 bash:
tmux new -d -s mysession "bash --init-file foo.script"
其中 foo.script 将包含您的命令。或者,您可以直接从命令行将命令提供给 shell:
tmux new -d -s mysession2 "bash --init-file <(echo ruby run.rb)"
请注意 --init-file 用于读取系统范围的初始化文件,例如 /etc/bash.bashrc,因此您可能希望在脚本中 'source' 这些文件。
我不确定这对你来说是否仍然有趣,但我想给你一个答案/提示:如果你想要,例如,通过 shell 脚本启动多个 tmux 会话并执行一些命令,你可以这样做:
# just for test and show case
mkdir test_1 test_2
echo "current tmux sessions"
tmux ls
echo "kill all tmux sessions"
tmux kill-server
declare -a directories=("test_1" "test_2")
for i in "${directories[@]}"
do
cd ${i}
pwd
tmux new -d -s ${i} "ls -la"
cd ..
done
为了演示,脚本将创建文件夹 test_1 和 test_2。之后,我通过这两个文件夹定义了一个包含两个文件夹和 运行 的数组,并使用当前文件夹名称启动 tmux 会话并执行命令 "ls -la".
如果您想 运行 浏览当前目录中的所有子目录,请将 "for i in "${directories[@]}" 替换为 "for f in *; do"。这是一个示例还排除符号文件夹:
echo "current tmux sessions"
tmux ls
echo "kill all tmux sessions"
tmux kill-server dependencies
for f in *; do
if [[ -d "$f" && ! -L "$f" ]]; then
cd ${f}
pwd
tmux new -d -s ${i} "ls -la"
cd ..
fi
done
这是要点文件的 link:https://gist.github.com/AICDEV/cf1497793bb1c27cb9b94d56c209ad6f
通过一些实验,我想出了如何通过 shell 脚本控制 tmux。
tmux new-session -d -s htop-session 'htop'; # start new detached tmux session, run htop
tmux split-window; # split the detached tmux session
tmux send 'htop -t' ENTER; # send 2nd command 'htop -t' to 2nd pane. I believe there's a `--target` option to target specific pane.
tmux a; # open (attach) tmux session.
以上将 tmux 会话分成两个 window,并且 运行s htop
在两个中。
要回答原始问题,您可以 运行 一个 ruby 脚本,而不是使用以下命令分离 tmux 会话:
tmux new-session -s ruby_session 'ruby run.rb'; # open tmux session and run ruby script.