【问题标题】:Clearing the bash "source buffer"清除 bash “源缓冲区”
【发布时间】:2017-01-26 08:38:33
【问题描述】:

当从命令行运行像 source script. script 这样的 bash 脚本时,脚本中的所有行都会添加到 bash 的“源缓冲区”中,然后当前的命令 shell 会继续运行。停止执行是不可能的(除了中止 shell),使用 ctrl-C 只会中断当前命令,但随后会执行下一个命令。

这个缓冲区在哪里,是否可以清除它??

示例脚本:

echo A
sleep 10
echo B
sleep 10
echo C
sleep 10
echo D

在完成“源脚本”之后,有什么方法可以阻止它在“提交”后继续执行?

【问题讨论】:

  • 请将您的脚本添加到您的问题中。
  • 你为什么使用source?如果您遇到这些问题,那么您可能应该将其作为一个单独的进程运行。
  • 使用源代码是因为在脚本完成运行后如果需要可以使用 shell 中的变量很方便。不是我有问题,我只是对此感到好奇。我知道,每当出现 return 语句时,缓冲区的其余部分都会被丢弃,但是如果你已经获取了一个类似上面的脚本,并且你想在同一个 shell 中停止它(保留当前环境和变量)怎么办? )。

标签: bash shell command-line buffer


【解决方案1】:

据我所知,bash 中没有 源缓冲区 这样的东西,所以没有什么可以删除的。 source 命令仅在当前环境中执行在其参数中找到的命令(即不在子进程中)。

source 的处理与信号的处理没有任何关系。也许您的 shell 脚本设置为忽略 Control-C?我建议您使用 -x 运行脚本以找到罪魁祸首。

【讨论】:

  • 我认为官方名称(根据 bash 手册页)是调用堆栈或执行调用堆栈(grep the bash man page for 'call stack')。当“采购”一个脚本时(grep bash 手册页中的 'source'),其中的命令在当前 shell 中被读取和执行。我尝试在脚本中间添加一行“chmod -r script”,但这并没有停止执行,所以我认为命令被读入缓冲区然后执行。
  • 正确的是,调用堆栈用于例如调用 shell 函数和获取脚本。但是,这是一个实现细节,与您无法取消调用的问题无关。您可以通过设置两个文件轻松验证这一点:sub.sh,其中包含行echo x; sleep 600;echo y,和main.sh,其中包含行source sub.sh; echo z。如果你通过bash main.sh 调用它,你会看到它输出x 然后休眠。如果此时使用 Control-C 中止它,它将立即终止,不再有输出。
  • 但那是因为您将 sub.sh 中的所有命令与分号放在同一行。如果你把每一个放在单独的行上,它将打印 y 和 z。但这很有趣...如果您将 sleep 600 与 echo x 放在同一行,它确实会停止,就像您将 sleep 600 放在同一行时一样; echo y 我想知道这是否真的应该像这样发生。
  • 这与行无关。我把它们放在同一行,因为我在 StackOverflow 的 Comment 函数中看不到分几行编写代码的方法。随意用换行符替换所有分号。
  • 如果我把它们放在不同的行上,它不会终止,它还会回显 y 和 z。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2016-08-18
  • 2020-05-16
  • 2011-04-15
  • 2017-06-11
  • 1970-01-01
相关资源
最近更新 更多