Не могу получить GNU Readline с Bash для использования STDOUT/FD1 в качестве RL_OUTSTREAMLinux

Ответить Пред. темаСлед. тема
Anonymous
 Не могу получить GNU Readline с Bash для использования STDOUT/FD1 в качестве RL_OUTSTREAM

Сообщение Anonymous »

Я пишу обертку 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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Не могу получить GNU Readline с Bash для использования STDOUT/FD1 в качестве RL_OUTSTREAM
    Anonymous » » в форуме Linux
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Ничего не происходит после subprocess.stdout.readline()/subprocess.stdout.read()
    Anonymous » » в форуме Python
    0 Ответы
    52 Просмотры
    Последнее сообщение Anonymous
  • Почему stdout pipe readline () не ждет нового персонажа?
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Почему stdout pipe readline () не ждет нового персонажа?
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Странная задержка при вызове readline () stdout
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Linux»