如何编写文本文件,然后在同一个 Bash 脚本中读取它?

Posted

技术标签:

【中文标题】如何编写文本文件,然后在同一个 Bash 脚本中读取它?【英文标题】:How can I write a text file, and then read from it in the same Bash script? 【发布时间】:2019-09-02 13:14:51 【问题描述】:

我在 Vim 中有一个热键,可以让我进入命令模式并调用 Bash 脚本。 Bash 脚本会尝试以下步骤:

    在两个标记之间选择文本 将选定的文本块发送到 .py 文件 将.py文件加载到IPython

如果我手动输入所有内容,脚本就可以工作,但是如果我运行脚本,文本块直到脚本完成后才会保存为文件,当 IPython 稍后尝试加载文件时会导致错误脚本。

以下是我尝试过的步骤:

    如果我的文件被保存在缓冲区中,我尝试了syncing and flushing 如果文件需要更多时间来编写,我尝试了sleep and wait 我还尝试asynchronous shell commands 来查看 Bash 脚本是否比 Vim 写入文件的优先级更高。
#!/bin/bash

# Text to be written has been selected in Vim
tmux send-keys ':w jtemp.py'
tmux send-keys 'Enter'

# Load code selection in IPython
tmux select-pane -t 1
tmux send-keys '%load jtemp.py'
tmux send-keys 'Enter'
tmux send-keys 'Enter'

如何在 Bash 脚本仍在运行时将文件保存到磁盘?

【问题讨论】:

【参考方案1】:

问题很可能(但我不确定)Vim 正在阻塞并且在脚本完成之前不处理按键。我不知道是否可以让 Vim 在后台运行脚本,但如果你在 tmux 中绑定热键而不是使用run-shell -b,你可以,比如:

bind F1 run -b "bash /path/to/my/script"

事实上,如果在 tmux 中执行此操作,您可能不需要脚本在后台运行,因为两个受影响的应用程序(Vim 和 IPython)不会阻塞,而 tmux 是否阻塞也没关系。所以你可以把-b 留在外面。

Enter 和选择窗格之间几乎肯定需要一秒或半秒的睡眠(“睡眠 1”或“睡眠 0.5”,实验),否则会有Vim 写入文件和 IPython 读取文件之间的竞争。

【讨论】:

谢谢,这行得通。我可以确认在这种情况下可以省略 -b 参数。 使用 BASH 命令while [ ! -f jtemp.py ]; do sleep .1 允许我运行脚本而无需手动调整睡眠时间。它每 0.1 秒检查一次文件是否存在,否则继续休眠。 对于不熟悉的人,tmux 中的热键绑定位于 ~/.tmux.conf 目录中。如果它不存在,您可以创建它。【参考方案2】:

我不确定在 shell 脚本中调用 tmux 的开销,但我建议您在没有它的情况下编写工作流程的脚本 - 您可以使用 sed 解析文件中两个标记之间的文本,管道将其添加到一个新的 .py 文件中,然后将该 .py 文件加载到 IPython 中。

【讨论】:

以上是关于如何编写文本文件,然后在同一个 Bash 脚本中读取它?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]

编写一个 Bash shell 脚本来读取 mongodb 日志文件并将其内容写入另一个文本文件

Bash脚本

Bash脚本

如何删除多余的双引号,而不是使用bash脚本在一行文本中打开和关闭双引号

三.shell 脚本