在screenrc中的Shell命令

时间:2018-04-16 11:07:56

标签: linux shell gnu-screen screenrc

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

在新的屏幕会话中,我要求屏幕打开一些窗口并命名它们并在每个窗口中打开一个文件,然后垂直拆分并打开到新的空窗口:

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隐藏文件,因此当我的计算机关闭并且文件未正确关闭时,当我重新打开屏幕时它会询问我必须做什么使用.sw *文件...我想首先运行此命令rm /path/to/folder/.*.sw*,这样它在打开时不会要求操作(“。file.txt.swp已经存在![O]打开,[ E] dit dit,[R] ecover,[Q] uit,[A] bandoned“)

在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

2 个答案:

答案 0 :(得分:1)

.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命令的选项将被正确解释,因为在屏幕内,它们只是一个选项。

如果您真的打算这样做,可能会遇到冲突,因为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实例因服务器关闭以外的其他原因而被杀死,您仍然可以恢复该文件。

答案 1 :(得分:-1)

当“.file.swp已经存在![O]打开,[E] dit无论如何,[R] ecover,[Q] uit,[A] bandoned”,你将有更多的运气去除“.file.swp “那么当你试图删除”file.swp“时,你不觉得吗?

你没注意到 DOT 吗?