如何在D中的Linux上检查特定程序(shell命令)是否可用?

时间:2015-10-11 10:58:47

标签: shell d

我正在尝试编写一个类似脚本的D程序,根据用户系统上某些工具的可用性,它会有不同的行为。

我想测试一个给定的程序是否可以从命令行获得(在这种情况下是unison-gtk)或是否已安装(我只关心使用apt的Ubuntu系统)

5 个答案:

答案 0 :(得分:2)

为了记录,可以使用例如tryRun

bool checkIfUnisonGTK() 
{
   import scriptlike;
   return = tryRun("unison-gtk -version")==0;
}

答案 1 :(得分:2)

而不是tryRun,我建议你抓住PATH环境变量,解析它(解析它很简单),并在这些目录中寻找特定的可执行文件:

module which1;

import std.process;   // environment
import std.algorithm; // splitter
import std.file;      // exists

import std.stdio;

/**
 * Use this function to find out whether given executable exists or not.
 * It behaves like the `which` command in Linux shell.
 * If executable is found, it will return absolute path to it, or an empty string.
 */
string which(string executableName) {
    string res = "";
    auto path = environment["PATH"];
    auto dirs = splitter(path, ":");
    foreach (dir; dirs) {
        auto tmpPath = dir ~ "/" ~ executableName;
        if (exists(tmpPath)) {
            return tmpPath;
        }
    }

    return res;
} // which() function

int main(string[] args) {
    writeln(which("wget")); // output: /usr/bin/wget
    writeln(which("non-existent")); // output: 

    return 0;
}

which()函数的一个自然改进是检查tmpPath是否是可执行文件,并仅在找到具有给定名称的可执行文件时返回...

答案 2 :(得分:1)

不能有任何“原生D解决方案”,因为您试图在系统环境中检测某些内容,而不是在程序本身内部。所以没有解决方案将是«本机»。

顺便说一下,如果你真的只关心Ubuntu,你可以解析命令dpkg --status unison-gtk的输出。但对我来说它打印package 'unison-gtk' is not installed and no information is available(我想我没有启用你拥有的一些回购)。所以我认为C1sc0的答案是最普遍的答案:你应该尝试运行which unison-gtk(或者你要运行的任何命令)并检查它是否打印任何内容。即使用户从存储库以外的任何地方安装了unison-gtk,这种方式也可以工作。已经从源构建它或将二进制文件直接复制到/usr/bin等等。

答案 3 :(得分:1)

Linux command to list all available commands and aliases

简而言之:运行auto r = std.process.executeShell("compgen -c")r.output中的每一行都是可用命令。需要安装bash。

答案 4 :(得分:0)

man which
man whereis
man find
man locate