如果我打开一个终端窗口(Gnome 终端 3.6.2)并键入一个命令,例如echo "hello"
,然后打开一个新的终端窗口并键入<Ctrl>Rhello
,我可能期望能够从历史记录中挖掘出该命令。
但我新输入的命令没有出现在(reverse-i-search)`':
提示符处。
但有些命令来自一些终端做出现在搜索中。
那么我的 Linux (Mint 17) 如何决定哪些终端的命令应该出现在哪些其他终端的搜索历史记录中呢?
答案1
终端应用程序本身与您描述的功能无关。了解终端所做的所有工作是文本输入和输出其余部分是在中完成的,这一点非常重要且非常有用壳。终端仅将您的按键重定向到终端中运行的程序,显示该程序生成的输出,并能够通知该程序有关终端大小的调整。理解这一点很重要,因为您需要知道应该配置什么来改变行为。
在绝大多数情况下,Linux 中的默认 shell 是巴什, 那就是巴什谁会对你的 ctrl-R 以及你在终端窗口中执行的所有其他操作做出反应。
您谈论的功能是 bash 历史。 bash 读取和写入历史记录的方式和时间有很多选择。默认情况下,bash 在退出 shell 时将历史记录附加到历史文件中,因此当您在一个 shell 中键入时,此命令永远不会出现在其他 shell 的历史记录中。
如果您添加以下内容,则可以在输入每个命令后保存:
export PROMPT_COMMAND="history -a"
到你的 ~/.bashrc 文件。
您还可以在每个命令后重新加载:
export PROMPT_COMMAND="history -a; history -r"
但我不建议这样做,因为将每个控制台专用于特定任务并在退出之前保留该特定任务的历史记录更有意义。
答案2
由于您在 Mint 上,我们假设您正在bash
作为 shell 运行。
您看不到最近从其他窗口键入的命令的原因是因为bash
在内存中维护当前正在运行的进程的历史列表,并在磁盘上维护不同的历史列表以保存会话之间的历史记录。
当交互式bash
shell 启动时,它会将历史文件(~/.bash_history
默认情况下)读取到正在运行的 shell 进程的运行时历史列表中。当您键入新命令时,它们仅附加到该进程的历史记录列表中,而不是磁盘上的历史记录文件中。
同样,bash
进程在退出之前将其历史列表写入磁盘上的历史文件。
如果您想在一个终端窗口 (T1) 中访问另一个窗口 (T2) 中的命令,您可以执行以下操作:
T1> history -a # append history lines from this session to the history file
T2> history -r # read the history file and append contents to the history list
在不同的控制台运行上述命令后bash
,您应该能够在T2的历史列表中找到来自T1的命令。
有许多环境变量和选项bash
可以影响历史列表行为。从bash
内置命令中查找更多详细信息help
:help history
。手册bash
页 ( man bash
) 和Bash 参考手册。