【问题标题】:C Linux shell - repeat the recent commandsC Linux shell - 重复最近的命令
【发布时间】:2013-12-25 04:17:42
【问题描述】:

我正在尝试实现一个 linux shell,在这一部分中,我正在尝试重复最近使用的命令。这是代码中的示例

if(strcmp(arg[0],"!") == 0 && arg[1] != NULL){
            if(strcmp(arg[1], "-1") == 0){
                 system("!!");


            }

我希望用户输入“!-1”时执行最后一个命令我尝试了系统命令“!!”但我收到一个错误“找不到命令”。你能帮忙吗?

提前致谢

【问题讨论】:

  • OP,您以不同的方式问过同一个问题 2 或 3 次。想清楚。你正在写一个shell。您有自己的命令行,用户可以通过该命令行输入命令。您正在尝试模仿 bash 不使用 bash。您将如何存储和检索用户输入的命令行?是否需要写入文件,或者只是将它们存储在某种数据结构中,您可以在 pgm (shell) 运行期间搜索和访问这些数据结构是否足够?

标签: c linux shell command history


【解决方案1】:

那是因为!! 并不是真正的命令。重复最近使用的命令是 bash 中的快捷方式。发生的事情是 system 正在您的 PATH 环境变量中寻找 !! 二进制文件,当然,没有找到它。

你能做的就是大多数 shell 所做的,保留最后使用的命令的文件并执行最后发出的命令。

例如,看一下文件~/.bash_history。这是控制台为您的用户记录的命令历史记录。为了达到您想要的效果,您可以将命令存储在内存中的缓冲区中(这不是一个好主意,因为如果您重置或关闭 shell,您将丢失历史记录),或者将它们保存在类似 .bash_history 的文件中。

另外,请查看history 命令及其手册页 (man history)。您会找到一个您可能会觉得有用的部分PROGRAMMING WITH HISTORY FUNCTIONS。通过包含<readline/history.h>,您将可以访问一些对历史进行操作的功能。我不知道你是否可以使用它,因为这可能只能在 bash 中访问,而且由于你正在创建自己的 shell,所以它可能不起作用。我仍然认为自己跟踪历史是KISS 的一种方式 :)

希望这会有所帮助!

【讨论】:

  • +1 但我猜 OP 并没有那么详细。通常分配只是要求他们将 N 过去的命令保存在内存中的某个地方并根据请求调用它们。
  • 我同意。出于这个原因,我提出了保留记忆建议。我回答的重点是指出 OP 为什么他会收到错误并就可能的解决方案提出建议
猜你喜欢
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
相关资源
最近更新 更多