【问题标题】:Shell command in screenrcscreenrc 中的 shell 命令
【发布时间】:2018-04-16 11:07:55
【问题描述】:

我正在尝试改进我的屏幕软件,所以我会有很多问题,因为我在互联网上很难找到很多答案......无论如何,这个是关于我会的 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]open, [E]无论如何,[R]恢复,[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

【问题讨论】:

    标签: linux shell gnu-screen screenrc


    【解决方案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 实例由于服务器关闭以外的其他原因被杀死,您仍然可以恢复文件。

    【讨论】:

    • 太棒了!我会尝试所有这些,如果遇到问题会告诉你,另外非常感谢!
    • 我的荣幸。如果这解决了您的问题,请随时单击我的答案左侧的绿色复选标记来关闭问题。 :)
    • 我没有尝试临时文件解决方案,但是另外两个完美运行!关于sh -c 命令,我还有一个问题和一个精确度:--c 选项用于覆盖 .screenrc 文件的配置-我假设sh 命令用于输入 shell 命令,但是我不清楚它是否是shell command“用于创建新的shell并覆盖环境变量$SHELL的值”?它可能并不重要,但它的含义对我来说是模糊的......
    • 所以..不完全是。在sh -c 中,-csh 命令的一个选项,它是您的POSIX shell。 man sh 了解详情。我们没有用这个命令覆盖任何东西,我们只是运行带有两个参数的sh 命令,-c 和一个包含要运行的 shell 命令的字符串。
    【解决方案2】:

    当“.file.swp 已经存在![O]open, [E]dit, [R]ecover, [Q]uit, [A]bandoned”,你会更幸运地删除“.file.swp” " 那么当您尝试删除“file.swp”时,您不觉得吗?

    您没有注意到 DOT 吗?

    【讨论】:

    • 无论文件名如何,这都不能回答问题。
    • 嗬,当然,我会编辑我的帖子,这不是问题,当我在 shell 中运行它时,我尝试在我的 .screenrc 文件中运行的命令行完美运行。 . 命令本身的语法很好,但是打开时如何让它在屏幕上运行对我来说是个谜
    • 另外,我不相信“vim /path/to/my/file1.txt”会创建一个名为“.file.swp”的文件,而是“.file1.txt.swp” .此外,它不会在 /path/to 中,而是在 /path/to/my 文件夹中。不是我试图回答这个问题,嗯@ghoti?
    • 如果/path/to 显然是一个例子,为什么你会认为file 不是一个例子呢?您是否不清楚 OP 是在询问如何在屏幕中运行额外的命令?
    • 在我看来,他似乎在尝试运行没有成功机会的命令,在屏幕之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多