Я ищу наиболее эффективный способ решить:
- Должен ли я предварительно представить пользовательскую командную строку с исполняемым файлом оболочки
- Если да, каким будет этот исполняемый файл? (/ bin / sh? / usr / bin / perl? / usr / bin / ksh? c: /../ cmd.exe?)
Известно, что для запуска сценария оболочки из Java нужно вместо этого запустить оболочку:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "script.sh", "arg1", "arg2);
Чтобы запустить двоичный файл, нужно запустить сам двоичный файл:
ProcessBuilder pb = new ProcessBuilder("/path/binary", "arg1", "arg2);
Если двоичный файл выполняется с помощью оболочки, он выдает ошибку:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "/path/binary", "arg1", "arg2);
(sh: cannot execute binary file)
Если скрипт оболочки выполняется без двоичного файла оболочки, он выдает ошибку:
ProcessBuilder pb = new ProcessBuilder("script.sh", "arg1", "arg2);
(error 2: file not found)
Я нахожусь в ситуации, когда мое приложение не знает, что оно запускает, двоичный файл или сценарий.
Запущенное приложение является обработчиком событий, предоставляемым конечным пользователем . Скорее всего, это сценарий оболочки, выполняемый под Unix; но это может быть * .cmd под Windows или Perl-скрипт, выполняемый на какой-то непонятной платформе. В конце концов, это Java.
Моей первой наивной попыткой было запустить командную строку с оболочкой и посмотреть, работает ли она. Если нет, попробуйте выполнить его как двоичный файл.
Это уродливо и рискованно: при какой-то неизвестной комбинации платформы и оболочки второй прогон все еще может выполнить сценарий второй раз с непредсказуемыми результатами.
Кроме того, я не могу сказать, когда сценарий запускался нормально и не сработал из-за какой-то проблемы, с которой я просто не могу его запустить.
Лучшее, что я сейчас рассматриваю, это:
- Прочитайте скрипт и поищите непечатаемые байты
- Если найдено, считайте его двоичным
- Если нет, добавьте / bin / sh (или cmd.exe, если под Windows)
Пожалуйста, сообщите, если у вас есть идеи получше.
ОБНОВЛЕНИЕ / ЧАСТИЧНОЕ РЕШЕНИЕ
Спасибо всем, кто поделился своими мыслями со мной.
Оказывается, я перепутал себя и остальную часть интернета:)
Не обязательно добавлять двоичный код перед введенной пользователем командной строкой, если:
- скрипт в PATH
- (для Unix) скрипт исполняемый
- (для Unix) скрипт имеет #! / Path / to / интерпретатор
Во время тестирования моего кода одно или другое из этих условий не выполнялось. : - (
После тщательного выполнения теста с нуля был выполнен скрипт.
Пункт 3 может быть выполнен только пользователем и должен быть задокументирован в Руководстве пользователя.
Из-за того, как эти сценарии распространяются на целевую систему, они могут не выполняться и могут отсутствовать в PATH.
Единственный путь, который мне небезразличен, является относительным, поэтому достаточно добавить ./ к любому относительному пути.
Создание сценариев, исполняемых под Unix (и любой другой платформой), является более сложной задачей. Это не WORA. Помещение / bin / sh перед ним может помочь, но, если я правильно помню, под Solaris оболочка не будет выполнять неисполняемый скрипт.
Я опубликую другое обновление позже на этой неделе.