我想通过窗格 # 直接切换到 Tmux 中的窗格。
我怎样才能做到这一点?我知道如何在窗格之间循环,并移动到当前窗格旁边的窗格。
我希望能够运行该display-panes
命令,该命令在每个窗格上显示“窗格#”,然后使用由display-panes
.
这可能吗?
注意:为了清楚起见,我不是指窗口,而是指窗格。谢谢!
有没有办法在 Tmux 中找出特定窗格的窗格索引?
我知道我可以运行类似的东西:
tmux display-message -p "#{pane_index}"
Run Code Online (Sandbox Code Playgroud)
但这仅适用于活动窗格。我希望它适用于它运行的任何窗格。通常当然很难在非活动窗格的窗格中运行脚本,但如果您使用:set-window-option synchronize-panes
同步所有窗格之间的输入,则可以。
在我的工作中,我需要同时连接到负载均衡器中的多个相同服务器,我使用 Tmux 窗格来完成。我通常会打开同步窗格功能,以便将我键入的任何内容同时发送到每个窗格。这很好用。
我发现我想连接到服务器并有时对每个窗格做一些独特的事情,每次都使用相同的“窗格索引”。例如,我会像这样运行一个命令:
ssh NODE_$(get_pane_number)
Run Code Online (Sandbox Code Playgroud)
在每个窗格中同步并运行时,它将在具有 4 个窗格的窗口中运行以下命令:
ssh NODE_0
在窗格 0
ssh NODE_1
在窗格 1
ssh NODE_2
在窗格 2
ssh NODE_3
在窗格 3
我当然可以编写这个脚本,但这只会在我开始同步输入之前运行良好。有时我也想在开始同步输入后执行此操作。
我经常使用子外壳运行命令,有时希望在运行某些东西之前扩展子外壳。这样我可以验证我在做什么,并可能编辑即将发生的事情。
例如,如何在运行之前扩展以下命令行,以便我可以编辑子shell的结果?
例如
$ find -name "test.txt"
/tmp/test.txt
$ mv $(!!) /tmp/new.txt
Run Code Online (Sandbox Code Playgroud)
我希望在运行命令之前看到扩展的子shell ,如下所示:
$ mv /tmp/test.txt /tmp/new.txt
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我试图弄清楚如何等待命令完成,然后将标准输入通过管道传输到标准输出。我使用的是 Mac,但我认为我的问题更多是关于如何等待进程完成并通过管道传输输出,然后是与 Mac 相关的任何事情。
我注意到,在 Mac 上,我可以say
一起运行几个命令,如果我使用运算符将它们连接起来,它们会等待每个短语完全说出后再开始下一个短语&&
。
$ say "stage 1" && say "stage 2"
Run Code Online (Sandbox Code Playgroud)
这就是真正的用例 - 我有一个 bash 脚本,我希望它在完成某些操作后将stdin 传递到 stdout。
$ cat /etc/passwd | say_and_pass "stage 1" | grep -v test | say_and_pass "stage 2"
Run Code Online (Sandbox Code Playgroud)
所以从概念上讲,这会大声说“阶段 1”,然后立即说“阶段 2”,然后将 grep 的内容转储/etc/password
到标准输出。
我对say_and_pass
脚本的初步破解是这样的:
#!/usr/bin/env bash
OUT="$*"
say "$OUT" && cat
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用;-)
编辑:我更改了上面的示例以用作say_and_pass "stage2"
最终命令,这是我的解决方案工作所必需的......
我经常发现自己在 shell 中,想要将文件名插入到冗长的命令中。
\n我想点击快捷方式,并使用 Netrw 或 Nerdtree 浏览文件或目录,并将其粘贴到命令 I\xe2\x80\x99m 构建中。
\n我会输入diff
然后我想点击快捷方式,使用 Netrw 或 Nerdtree 进行可视化浏览,然后选择一个文件。
\n该文件名现在已添加到我的 diff 命令中...例如diff /tmp/file1.txt
我再次点击快捷方式,然后浏览第二个文件,\n/super/ez/another/file/somewhere/else/compare.txt
然后将第二个文件添加到我的diff
命令中,所以我现在有:
diff /tmp/file1.txt /super/ez/another/file/somewhere/else/compare.txt\n
Run Code Online (Sandbox Code Playgroud)\n使用任何工具可以做到这一点吗?我喜欢 Vim 中的 Netrw,但愿意尝试新事物!
\nTab请注意,我对使用通配符完成文件名不感兴趣。这有时有效,但并非总是有效。我喜欢 Netrw,并且很想弄清楚如何使用它通过浏览来选择文件名。
\n我经常在 bash 提示符下编写命令,我想在其中获取以前的参数,在我输入的 CURRENT 行中,然后放在命令的其他位置。
一个简单的例子,如果我想重命名一个文件。我会
mv
命令~/myTestFileWithLongFilename.txt
我可以以某种方式使用历史记录或 bash 完成来自动完成第一个参数吗?
$ mv ~/myTestFileWithLongFilename.txt ~/myTestFileWithLongFilename.md
Run Code Online (Sandbox Code Playgroud)
我当然知道我可以执行不完整的命令,将其放入历史记录中,然后用 引用它!$
,但是我的历史记录被无效命令污染,我想知道是否有更好的方法
我正在编写 Tmux 脚本,并想通过 bash 脚本了解当前窗口中的窗格数量。
有没有办法找出这些信息?
在伪代码中,我想要这样的东西:
#!/bin/bash
COUNT=$(tmux get_number_of_panes)
...
Run Code Online (Sandbox Code Playgroud) 我有一个 bash 脚本,我想遍历 stdin 中的行,或者遍历传入的每个参数。
有没有一种干净的方法来写这个,所以我不必有 2 个循环?
#!/bin/bash
# if we have command line args...
if [ -t 0 ]
then
# loop over arguments
for arg in "$@"
do
# process each argument
done
else
# loop over lines from stdin
while IFS= read -r line; do
# process each line
done
fi
Run Code Online (Sandbox Code Playgroud)
编辑:我正在寻找一个只使用一个循环的通用解决方案,因为我发现我想经常这样做,但总是写出 2 个循环,然后调用一个函数。所以也许某些东西可以将 stdin 变成一个数组,所以我可以使用单个循环来代替?