Я как бы спускаю здесь здесь. Вчера потратил около 8 часов, пробуя различные методы исполнения и не смог никуда добраться. Я хотел бы узурпировать FD2 этого детского процесса со своим собственным делом, который подается из обертки GO. Эта часть я могу сделать все хорошо. Я даже могу выполнить штраф. Проблема заключается в том, что READLINE отказывается использовать FD1 для своего потока, поэтому она заканчивается таким, что моя вещь на FD2 вроде «ест» вывод чтения. Это означает, что на экране нет ничего, что я печатаю (нет, это не режим эхо -терминала, если это то, о чем вы думаете), и последняя строка моей подсказки (у меня есть сложная двух линия PS1 для этого). Очевидно, это чтения. Однако, насколько я понимаю, Bash+Readline должен использовать FD2 только для своего потока, если STDOUT обнаруживается, чтобы не быть TTY. Если это неверно, пожалуйста, сообщите мне! FD2 вещь. Это просто выполняет Bash, отлично работает. Это ниже, очевидно, что процесс 'stdout не является TTY, да. Но даже когда я прохожу в «tty» прямо на Stdin и Stdout, происходит то же самое. Я также использовал Pty (Creack/Pty Package) и то же самое происходит. И да, я знаю, что Pty - это способ сделать это, но я стараюсь сохранить площадь поверхности внешних зависимостей как можно более узкой. < /P>
func executeScript(scriptPath string, cfg *config.Config) error {
msgSock, err := service_util.OpenSocket("messages")
if err != nil {
return err
}
defer msgSock.Close()
cmd := exec.Command(
"/usr/bin/env",
"bash",
"-c",
buildScriptCommand(scriptPath, cfg),
)
cmd.ExtraFiles = append(make([]*os.File, 31334), msgSock)
if tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0); err == nil {
defer tty.Close()
cmd.SysProcAttr = &syscall.SysProcAttr{
Setpgid: true,
Ctty: int(tty.Fd()),
Foreground: true,
}
}
if len(cfg.Args) > 2 {
cmd.Args = append(cmd.Args, cfg.Args...)
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
< /code>
работает, пока я либо пытаюсь установить cmd.stderr, чтобы быть MSGSOCK, либо если я попытаюсь даже свернуть FD1 и 2 в файле Bash Init, при перемещении другого FD на место как FD2. Все это имеет одно и то же поведение, выходы чтения к FD2, поэтому моя вещь на FD2 ест его. Я просто хочу, чтобы чтения выводили на FD1/STDOUT. < /p>
Этот пост будет длиной 10 страниц, если бы я показал вам все, что я пробовал, некоторые из них включают: < /p>
Выполнение удара по -разному < /li>
< /ul>
Если я выполняю Bash с помощью -не отключить линию чтения, это доказывает, что линия чтения здесь является виновником, так как то, что я введите D назад. Но я хочу, чтобы Readline работала для этого приложения. Я также попробовал неинтерактивность, что имеет аналогичный эффект. Я также лишил команду, чтобы просто быть избитым без дополнительных сценариев, которые я передаю. В основном, как бы я ни нарезал этот пирог, я все еще ем sh **. < /P>
pty < /li>
< /ul>
Как я уже говорил Я лекции по этому вопросу, потому что, насколько я могу судить в этом случае, это не имеет значения, так как поведение Ридлайн одинаково. Если, однако, вы знаете о каком -то магическом заклинании с библиотекой Creack /Pty (де -факто стандарт для Go), тогда я не буду слушать! < /P>
FED FD2 напрямую < /li>
< /ul>
Как уже упоминалось до того, как я попытался перенести MSGSOCK непосредственно в FD2. Это еще одна причина, по которой я знаю, что сам Readline пытается транслировать в FD2- в коде моего хода я вижу последнюю строку подсказки и то, что я ввожу, что я начал печатать, чтобы доказать это.
Поместите Msgsock на высокий FD, затем установите его в Bash с Exec < /li>
< /ul>
Я включаю Msgsock на FD 31337 Затем сделал: < /p>
exec 2>&1 2
Такая же разница. < /p>
сделал снимок в темноте с настройками .InputRC < /li>
< /ul>
Я даже бросил некоторые настройки Longshot в Inputrc, пытаясь увидеть, смогу ли я изменить это поведение. Я ни к чему не пошел с этим, точно так же, как я думал. Поймите, почему это происходит. Возможно, мне нужно снова погрузиться в это свежей головой, но вместо того, чтобы ударить по этому поводу на один полный день, я подумал, что спрошу здесь.
Подробнее здесь: https://stackoverflow.com/questions/793 ... -outstream
Не могу получить GNU Readline с Bash для использования STDOUT/FD1 в качестве RL_OUTSTREAM ⇐ Linux
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Не могу получить GNU Readline с Bash для использования STDOUT/FD1 в качестве RL_OUTSTREAM
Anonymous » » в форуме Linux - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Ничего не происходит после subprocess.stdout.readline()/subprocess.stdout.read()
Anonymous » » в форуме Python - 0 Ответы
- 55 Просмотры
-
Последнее сообщение Anonymous
-