Вызов оболочки из java, он жалуется stty: стандартный ввод: неверный аргумент

Я вызываю команду оболочки классом Process из java, и она печатает

"stty: standard input: Invalid argument" 

независимо от того, верна команда или нет (также показан нормальный вывод команды оболочки). Если я запускаю команду оболочки в оболочке, такое сообщение об ошибке не отображается.

Команда примерно такая: {"/bin/csh", "-c", "echo hello"}


person solotim    schedule 29.03.2010    source источник
comment
В таком случае пример кода будет очень полезен.   -  person Riduidel    schedule 29.03.2010
comment
Я ничего не делал, кроме очень простых вещей, чтобы вызвать эхо-привет из java. Этот код на самом деле работает нормально несколько недель назад, поэтому я думаю, что недавно что-то не так с моим bash, а не с java.   -  person solotim    schedule 29.03.2010
comment
Я считаю, что в Java есть способы выполнять функции операционной системы, и нет необходимости вызывать системные команды. какую команду вы вызываете, что у Java нет модуля для этого?   -  person ghostdog74    schedule 29.03.2010
comment
Ну, я хочу создать оболочку, встроенную в java. Пользователь может ввести любую команду оболочки, и java выполнит их и вернет stdout/stderr в java gui.   -  person solotim    schedule 30.03.2010


Ответы (4)


Попробуйте использовать параметр -f команды csh, чтобы отключить чтение файлов .chsrc и .login:

    {"/bin/csh", "-cf", "echo hello"}
person user85421    schedule 29.03.2010
comment
@solotim: почему бы и нет? в любом случае, если это работает, это указывает на то, что скрипт .cshrc или .login пытается настроить терминал, не проверяя, есть ли он. Следующим шагом должно быть добавление этой проверки в скрипты... - person user85421; 30.03.2010

Вы вызываете команду stty из своего .profile или .bash_profile. Вам придется перенаправить его стандартную ошибку на /dev/null.

stty blah blah blah 2>/dev/null

stty не может работать с псевдотерминалом, который предоставляет Java при распаковке.

person Jonathan Feinberg    schedule 29.03.2010
comment
Спасибо, а что такое бла? - person solotim; 29.03.2010
comment
Неважно, что это означает. Вызов stty в контексте, где нет tty, например, в процессе exec'd, неверен. Вы не можете этого сделать. - person user207421; 29.03.2010

Процитируйте документацию для java.lang.Process:

«Методы создания процессов могут не работать для специальных процессов на определенных собственных платформах, таких как собственные оконные процессы, процессы демона, процессы Win16/DOS в Microsoft Windows или сценарии оболочки. Созданный подпроцесс не имеет собственного терминала или консоли. ."

Возможно, вам нужен java.lang.ProcessBuilder вместо этого.

person msw    schedule 29.03.2010
comment
Спасибо. Но на самом деле я тоже пользовался ProcessBuilder, получается те же результаты. - person solotim; 29.03.2010

Вы посмотрите здесь. Мне удалось запустить некоторые команды, такие как this

person Shervin Asgari    schedule 29.03.2010