Поправьте меня, если я ошибаюсь, но симптомы таковы:
exec("/usr/bash", "-c", "executable > filename.txt")
создает пустой файл.
exec("/usr/bash", "-c", "executable -o filename.txt")
не создает файл.
- Один или оба из вышеперечисленных дает код выхода
255
, когда вы смотрите на него.
- Когда вы запускаете команду из командной строки как
executable -o filename.txt
или executable > filename.txt
, она работает как положено.
В свете вышесказанного, я думаю, что наиболее вероятной причиной является то, что /bin/bash
не находит executable
при запуске его из Java. Тот факт, что в первом примере создается пустой файл, означает, что /bin/bash
что-то делает. Но если вы попытаетесь запустить
$ unknown-command > somefile.txt
из приглашения оболочки bash вы получите сообщение об ошибке, в котором говорится, что команда не может быть найдена , и пустой файл "thing.txt ". (Вы не увидите сообщение об ошибке в вашем Java-приложении, потому что оно записывается в stderr, и вы его не захватываете.) Причина, по которой создается пустой файл "thing.txt ", заключается в том, что оно открывается оболочкой * За 1026 * до он пытается форкнуть и выполнить "исполняемый файл".
Если это проблема , то простое решение - использовать абсолютный путь к исполняемому файлу.
Кроме того, если вы не выполняете перенаправление командной строки или другую магию оболочки, нет необходимости запускать исполняемый файл в новом экземпляре bash
. Скорее просто сделайте это:
Process p = Runtime.getRuntime().exec("executable", "-o", filename.txt");
затем дождитесь завершения процесса и проверьте код завершения, прежде чем пытаться прочитать содержимое файла.