Я пишу обертку Go, которая делает разные вещи, а затем выполняет интерактивную оболочку Bash. Я хотел бы узурпировать FD2 этого детского процесса со своим собственным делом, который подается из обертки GO. Эта часть я могу сделать все хорошо. Я даже могу выполнить штраф. Проблема заключается в том, что READLINE отказывается использовать FD1 для своего потока, поэтому она заканчивается таким, что моя вещь на FD2 вроде «ест» вывод чтения. Это означает, что на экране нет ничего, что я печатаю (нет, это не режим эхо -терминала, если это то, о чем вы думаете), и последняя строка моей подсказки (у меня есть сложная двух линия PS1 для этого). Очевидно, это чтения. Однако, насколько я понимаю, Bash+Readline должен использовать FD2 только для его потока, если STDOUT обнаруживается, чтобы не быть TTY (если это неверно, сообщите мне). < /P>
i Я собираюсь вставить какой -то базовый код из обертки GO, который иллюстрирует то, что я делаю, и это рабочий пример, поскольку он на самом деле не делает вещь FD2. Это просто выполняет Bash, отлично работает. Это ниже, очевидно, что процесс 'stdout не a 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>
[list]
[*] Выполнение Bash по -разному < /p>
Если я выполняю Bash с помощью -не отключить линию чтения, это доказывает, что линия чтения является виновником, так как то, что я введите, возвращает Echo'd. Но я хочу, чтобы Readline работала для этого приложения. Я также попробовал неинтерактивность, что имеет аналогичный эффект. Я также лишил команду, чтобы просто быть избитым без дополнительных сценариев, которые я передаю. В основном, как бы я ни нарезал этот пирог, я все еще ем sh **.
pty < /p>
Как я уже говорил Точка, потому что, насколько я могу судить в этом случае, это не имеет значения, так как поведение READLINE одинаково. Если, однако, вы знаете о каком -то магическом заклинании с библиотекой Creack/Pty (De -Facto Standard Afaict for Go), тогда во что бы то ни стало, я слушаю!
< li> Fed FD2 в непосредственной степени < /p>
Как уже упоминалось до того, как я пытался пропустить MSGSOCK непосредственно в FD2. Это еще одна причина, по которой я знаю, что сам Readline пытается транслировать в FD2- в коде моего хода я вижу последнюю строку подсказки и то, что я ввожу, что я начал печатать, чтобы доказать это.
< /li>
[*] Поместите msgsock на высокий FD, затем установите его в Bash с Exec < /p>
Я поместил MSGSOCK на FD 31337, затем сделал : < /p>
exec 2>&1 2
Подробнее здесь: [url]https://stackoverflow.com/questions/79397922/cant-get-gnu-readline-with-bash-to-use-stdout-fd1-as-rl-outstream[/url]
Я пишу обертку Go, которая делает разные вещи, а затем выполняет интерактивную оболочку Bash. Я хотел бы узурпировать FD2 этого детского процесса со своим собственным делом, который подается из обертки GO. Эта часть я могу сделать все хорошо. Я даже могу выполнить штраф. Проблема заключается в том, что READLINE отказывается использовать FD1 для своего потока, поэтому она заканчивается таким, что моя вещь на FD2 вроде «ест» вывод чтения. Это означает, что на экране нет ничего, что я печатаю (нет, это не режим эхо -терминала, если это то, о чем вы думаете), и последняя строка моей подсказки (у меня есть сложная двух линия PS1 для этого). Очевидно, это чтения. Однако, насколько я понимаю, Bash+Readline должен использовать FD2 только для его потока, если STDOUT обнаруживается, чтобы не быть TTY (если это неверно, сообщите мне). < /P> i Я собираюсь вставить какой -то базовый код из обертки GO, который иллюстрирует то, что я делаю, и это рабочий пример, поскольку он на самом деле не делает вещь FD2. Это просто выполняет Bash, отлично работает. Это ниже, очевидно, что процесс 'stdout не a tty, да. Но даже когда я прохожу в «tty» прямо на Stdin и Stdout, происходит то же самое. Я также использовал Pty (Creack/Pty Package) и то же самое происходит. Я знаю, что Pty - это способ сделать это, но я пытаюсь сохранить площадь поверхности внешних зависимостей как можно более узкой. < /P> [code]func executeScript(scriptPath string, cfg *config.Config) error { msgSock, err := service_util.OpenSocket("messages") if err != nil { return err } defer msgSock.Close()
return cmd.Run() } < /code> отлично работает, пока я не попытаюсь установить cmd.stderr на MSGSOCK, либо если я попытаюсь даже свернуть FD1 и 2 в файле Bash Init, перемещая другой FD на место, как FD2. Все это имеет одно и то же поведение, выходы чтения к FD2, поэтому моя вещь на FD2 ест его. Я просто хочу, чтобы чтения выводили на FD1/STDOUT. < /p> Этот пост будет длиной 10 страниц, если бы я показал вам все, что я пробовал, некоторые из них включают: < /p> [list] [*] Выполнение Bash по -разному < /p> Если я выполняю Bash с помощью -не отключить линию чтения, это доказывает, что линия чтения является виновником, так как то, что я введите, возвращает Echo'd. Но я хочу, чтобы Readline работала для этого приложения. Я также попробовал неинтерактивность, что имеет аналогичный эффект. Я также лишил команду, чтобы просто быть избитым без дополнительных сценариев, которые я передаю. В основном, как бы я ни нарезал этот пирог, я все еще ем sh **.
pty < /p> Как я уже говорил Точка, потому что, насколько я могу судить в этом случае, это не имеет значения, так как поведение READLINE одинаково. Если, однако, вы знаете о каком -то магическом заклинании с библиотекой Creack/Pty (De -Facto Standard Afaict for Go), тогда во что бы то ни стало, я слушаю!
< li> Fed FD2 в непосредственной степени < /p> Как уже упоминалось до того, как я пытался пропустить MSGSOCK непосредственно в FD2. Это еще одна причина, по которой я знаю, что сам Readline пытается транслировать в FD2- в коде моего хода я вижу последнюю строку подсказки и то, что я ввожу, что я начал печатать, чтобы доказать это. < /li> [*] Поместите msgsock на высокий FD, затем установите его в Bash с Exec < /p> Я поместил MSGSOCK на FD 31337, затем сделал : < /p> exec 2>&1 2
Я как бы спускаю здесь здесь. Вчера потратил около 8 часов, пробуя различные методы исполнения и не смог никуда добраться. Я хотел бы узурпировать FD2 этого детского процесса со своим собственным делом, который подается из обертки GO. Эта часть я...
Из Python я пытаюсь управлять cmd в Cosnolly, вот мой код:
cmd_process = subprocess.Popen( , stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='cp866')
Почему Print (Line) в read_stdout Печать каждого символа вместо всей строки? Я ожидаю, что он добавит в очередь после достижения персонажа Newline, но вместо этого он просто помещает каждого персонажа.
plugin_test.py:
from subprocess import PIPE,...
Почему Print (Line) в read_stdout Печать каждого символа вместо всей строки? Я ожидаю, что он добавит в очередь после достижения персонажа Newline, но вместо этого он просто помещает каждого персонажа.
plugin_test.py:
from subprocess import PIPE,...
Я вызываю исполняемый файл, записанный в C, через конструктор Popen в Python, чтобы прочитать то, что обычно выводит исполняемый файл в консоль/терминал. Printf в коде C завершается с помощью \ n регулярно, и он постоянно выводит в терминал, пока не...