Вместо 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 исполняемый файл, или нет, и вернуться только тогда, когда он нашел исполняемый с данным именем ...
Я знаю эти инструменты очень хорошо. Я спрашиваю, есть ли решение * native * D (библиотека), которое решает проблему. –
Возможно, вам стоит просто проверить, существует ли файл? –
@ user1432751 Это действительно то, что я сделал с моим ответом. Хитрость заключается в том, чтобы проверить, существует ли файл в пути поиска по умолчанию (и, возможно, проверять вывод «-version»), поскольку он может быть установлен в разных местах. –