当前位置: 首页 > 知识库问答 >
问题:

从Java程序调用命令历史记录

茹建茗
2023-03-14

我们试图从Java程序调用Linux命令history。我们能够从Java调用相当多的命令,包括datels-l而没有任何问题。但是,historyjava.io.ioException失败。示例源代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class OSCommand {
    public static void main(String[] args) throws Exception {
        dumpCommandOutput("Date", new String[] {"date"});
        // SUCCEEDS

        dumpCommandOutput("Long Directory Listing", new String[] {"ls", "-l"});
        // SUCCEEDS

        dumpCommandOutput("Command History", new String[] {"history"});
        // FAILS
    }

    protected static void dumpCommandOutput(String label, String[] cmdWithArgs) throws IOException {
        System.out.println("Attempting to execute: " + label);
        
        Process p = Runtime.getRuntime().exec(cmdWithArgs);

        InputStream is = p.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        
        String str;
        
        while((str = br.readLine()) != null) {
            System.out.println(str);
        }
        br.close();
        System.out.println("\n\n");
    }
}

引发的异常

Exception in thread "main" java.io.IOException: Cannot run program "history": error=2, No such file or directory
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
        at java.lang.Runtime.exec(Runtime.java:621)
        at java.lang.Runtime.exec(Runtime.java:486)
        at OSCommand.dumpCommandOutput(OSCommand.java:16)
        at OSCommand.main(OSCommand.java:10)
Caused by: java.io.IOException: error=2, No such file or directory
        at java.lang.UNIXProcess.forkAndExec(Native Method)
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
        at java.lang.ProcessImpl.start(ProcessImpl.java:134)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
        ... 4 more

共有1个答案

冯开诚
2023-03-14

命令“history”不是linux发行版中已安装的程序。相反,它是您正在使用的shell中提供的内置命令。因此,java不需要使用runtime.getruntime().exec()来执行。检查对datelshistory参数使用whice命令时得到的结果:

linryzen ~ # echo $0
bash
linryzen ~ # which ls
/bin/ls
linryzen ~ # which date
/bin/date
linryzen ~ # which history
which: no history in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
                      /opt/bin:/usr/lib/llvm/12/bin:/usr/lib/llvm/11/bin:
                      /usr/lib/llvm/9/bin)
linryzen ~ # 
 类似资料:
  • 我需要类似于bash历史的命令历史记录。我需要在Android手机中创建一个历史文件。 有没有这样的功能 如果没有,任何人都可以将我指向中的代码,在那里它从桌面接收命令? 我可以实现同样的功能。 我尝试在Android上启用外壳历史记录,但它不适用于调用的命令。

  • 在gdb中,缺省是不保存历史命令的。你可以通过如下命令来设置成保存历史命令: (gdb) set history save on 但是,历史命令是缺省保存在了当前目录下的.gdb_history文件中。可以通过如下命令来设置要保存的文件名和路径: (gdb) set history filename fname 现在,我们把这两个命令放到$HOME/.gdbinit文件中: set histo

  • 10.3 命令别名与历史命令 我们知道在早期的 DOS 年代,清除屏幕上的信息可以使用 cls 来清除,但是在 Linux 里面, 我们则是使用 clear 来清除画面的。那么可否让 cls 等于 clear 呢?可以啊!用啥方法? link file 还是什么的?别急!下面我们介绍不用 link file 的命令别名来达成。那么什么又是历史命令? 曾经做过的举动我们可以将他记录下来喔!那就是历史

  • 问题内容: 有没有一种方法可以防止将命令添加到bash shell的命令历史记录中? 我希望能够阻止将某些“危险”命令添加到历史记录中,例如“ ”,这样,通过按向上箭头以到达先前的命令,我将无法使用该命令。这样,不可能意外地重复这些命令之一。 我问的原因是,我经常使用向上箭头来访问Shell历史记录中的先前命令,并且经常使自己陷入按Enter 键的地步,因为我 认为这 是正确的命令,才意识到我将要

  • 读取播放历史信息 调用地址 http://api.bilibili.cn/history 返回 返回值字段 字段类型 字段说明 results int 返回的记录总数目 list object 返回数据 返回字段 “list” 子项 返回值字段 字段类型 字段说明 aid int 视频编号 typeid int 视频分类ID typename string 视频分类名称 title string

  • 历史记录 控制台维护 Elasticsearch 成功执行的最后500个请求列表。点击窗口右上角的时钟图标即可查看历史记录。这个图标会打开历史记录面板,您可以在其中查看历史请求。您也可以在这里选择一个请求,它将被添加到编辑器中当前光标所在的位置。 图 9. 历史记录面板