gpt4 book ai didi

linux - screenrc 中的 shell 命令

转载 作者:太空宇宙 更新时间:2023-11-04 05:15:37 25 4
gpt4 key购买 nike

我正在尝试改进我的 screen 软件,所以我会有很多问题,因为有很多答案我很难在互联网上找到...无论如何,这是一个关于我希望 screen 在打开时执行的 shell 命令,但它没有...

在 screen 的新 session 上,我要求 screen 打开一些窗口并命名它们并在每个窗口中打开一个文件,然后垂直拆分并打开新的空窗口:

screen -t name1 vim /path/to/folder/file1.txt
screen -t name2 vim /path/to/folder/file2.txt
screen -t name3 vim /path/to/folder/file3.txt
screen -t name4 vim /path/to/folder/file4.txt
split -v
focus
screen
focus
screen

但这些文件会像往常一样创建 .file.txt.swp 和 .file.txt.swo 隐藏文件,因此当我的计算机关闭且文件未正确关闭时,当我重新打开 screen 时,它会询问我必须如何处理 .sw* 文件...我想首先运行此命令 rm/path/to/folder/.*.sw* 因此打开时它不会要求执行操作(“.file.txt.swp 已存在![O]open,[E]无论如何,[R]恢复,[Q]uit,[A]放弃”)

在 shell 中 rm path/to/folder/.*.sw* 按预期删除每个交换文件,但我无法使其在 .screenrc 中工作

这不起作用:

rm /path/to/folder/.*.sw*

screen -t name1 vim /path/to/folder/file1.txt
screen -t name2 vim /path/to/folder/file2.txt
screen -t name3 vim /path/to/folder/file3.txt
screen -t name4 vim /path/to/folder/file4.txt
split -v
focus
screen
focus
screen

这也不是:

exec rm /path/to/folder/.*.sw*

...

也不是这个:

eval 'rm /path/to/folder/.*.sw*'

...

甚至是这个:

stuff rm /path/to/folder/.*.sw*

...

以及许多其他“盲目”尝试...

好吧,我不知道我在做什么:p

最佳答案

.screenrc 中,screen 命令采用一个字符串,它会对其自身求值,而不是传递给 shell。所以你不能这么容易地将多个命令组合在一起......例如,像这样的配置行:

screen -t test1 touch foo; touch bar

会导致三个文件被触摸——foo;touchbar。 :)

相反,您可以运行 shell 解释器来运行多个命令,包括 vim:

screen -t name1 sh -c 'rm /path/to/my/.file1.sw*; vim /path/to/my/file1.txt'

传递给 sh 命令的选项将被正确解释,因为在 screen 内,它们都只是一个选项。

如果您确实打算这样做,您可能会遇到冲突,因为 name2name3 等将在另一个窗口中删除它们的同时生成交换文件,因此您可以这样做:

screen -t name1 sh -c 'rm /path/to/my/.file1.sw*; vim /path/to/my/file1.txt'
screen -t name2 sh -c 'sleep 1; vim /path/to/my/file2.txt'
screen -t name3 sh -c 'sleep 1; vim /path/to/my/file3.txt'
screen -t name4 sh -c 'sleep 1; vim /path/to/my/file4.txt'

请注意,另一种选择可能是告诉 vim 根本不创建交换文件。交互地,您可以通过以下方式执行此操作:

:set noswapfile

要将其放在命令行上(而不是将其设置为所有 vim 实例的默认值),您可以使用 vim 的 -n 选项,这会导致 vim 打开没有交换的文件:

screen -t name1 vim -n /path/to/my/file1.txt
screen -t name2 vim -n /path/to/my/file2.txt
screen -t name3 vim -n /path/to/my/file3.txt
screen -t name4 vim -n /path/to/my/file4.txt

结果当然是对四个文件未保存的更改将会丢失。

还有一个选择可能是将临时文件移动到单独的位置。例如,如果您使用 tmpfs/shmfs 并且您的/tmp 目录在每次重新启动时都是空的,您可以使用:

screen -t name1 vim --cmd 'set dir=/tmp' /path/to/my/file1.txt
screen -t name2 vim --cmd 'set dir=/tmp' /path/to/my/file2.txt
screen -t name3 vim --cmd 'set dir=/tmp' /path/to/my/file3.txt
screen -t name4 vim --cmd 'set dir=/tmp' /path/to/my/file4.txt

如果 vim 实例因服务器关闭以外的其他原因被终止,您仍然可以恢复该文件。

关于linux - screenrc 中的 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49855823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com