Shell screenrc 中的命令
Shell command in screenrc
我正在努力改进我的屏幕软件,所以我会有很多问题,因为有很多我很难在互联网上找到的答案...无论如何,这个是关于 shell 我希望屏幕在打开时执行的命令,但它没有...
在新的 screen 会话中,我要求 screen 打开一些 windows 并命名它们并在每个中打开一个文件,然后垂直拆分并打开新的空 windows:
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] 无论如何,[R] 恢复,[Q] 退出,[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*
...
还有很多其他 'blind' 尝试...
嗯,我不知道我在做什么 :p
当“.file.swp 已经存在![O]open,[E]dit anyway,[R]ecover,[Q]uit,[A]bandoned”,你将有更多的运气删除“ .file.swp" 那么当您尝试删除 "file.swp" 时,您不觉得吗?
你没注意到 DOT 吗?
在您的 .screenrc
中,screen
命令接受一个 字符串 ,它会自行评估而不是传递给 shell。所以你不能这么容易地将多个命令组合在一起......例如,这样的配置行:
screen -t test1 touch foo; touch bar
将导致三个文件被触及 -- foo;
、touch
和 bar
。 :)
相反,您可以 运行 一个 shell 解释器来 运行 多个命令,包括 vim
:
screen -t name1 sh -c 'rm /path/to/my/.file1.sw*; vim /path/to/my/file1.txt'
传递给 sh
命令的选项将被正确解释,因为在屏幕中,它们都只是一个选项。
如果您真的打算这样做,您可能会 运行 发生冲突,因为 name2
和 name3
等将在删除它们的同时生成交换文件另一个 window,所以你可以这样做:
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
实例由于服务器关闭以外的其他原因被杀死,您仍然可以恢复文件。
我正在努力改进我的屏幕软件,所以我会有很多问题,因为有很多我很难在互联网上找到的答案...无论如何,这个是关于 shell 我希望屏幕在打开时执行的命令,但它没有...
在新的 screen 会话中,我要求 screen 打开一些 windows 并命名它们并在每个中打开一个文件,然后垂直拆分并打开新的空 windows:
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] 无论如何,[R] 恢复,[Q] 退出,[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*
...
还有很多其他 'blind' 尝试...
嗯,我不知道我在做什么 :p
当“.file.swp 已经存在![O]open,[E]dit anyway,[R]ecover,[Q]uit,[A]bandoned”,你将有更多的运气删除“ .file.swp" 那么当您尝试删除 "file.swp" 时,您不觉得吗?
你没注意到 DOT 吗?
在您的 .screenrc
中,screen
命令接受一个 字符串 ,它会自行评估而不是传递给 shell。所以你不能这么容易地将多个命令组合在一起......例如,这样的配置行:
screen -t test1 touch foo; touch bar
将导致三个文件被触及 -- foo;
、touch
和 bar
。 :)
相反,您可以 运行 一个 shell 解释器来 运行 多个命令,包括 vim
:
screen -t name1 sh -c 'rm /path/to/my/.file1.sw*; vim /path/to/my/file1.txt'
传递给 sh
命令的选项将被正确解释,因为在屏幕中,它们都只是一个选项。
如果您真的打算这样做,您可能会 运行 发生冲突,因为 name2
和 name3
等将在删除它们的同时生成交换文件另一个 window,所以你可以这样做:
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
实例由于服务器关闭以外的其他原因被杀死,您仍然可以恢复文件。