我正在尝试编写一个类似脚本的D程序,根据用户系统上某些工具的可用性,它会有不同的行为。
我想测试一个给定的程序是否可以从命令行获得(在这种情况下是unison-gtk
)或是否已安装(我只关心使用apt
的Ubuntu系统)
答案 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