Как изменить перенаправление вывода рабочего процесса?

Вот простой путь, который приходит на ум

echo 'GET / HTTP/1.1
Host: google.com

' | openssl s_client -quiet -connect google.com:443 2>/dev/null
11
13.04.2017, 15:36
3 ответа

Это не идеально, но затем снова bash завершение довольно сложная вещь...

Самый простой способ на основе команды, это немного более гибкий, чем FIGNORE , вы можете сделать:

 complete -f -X "/myproject/data/*" vi

Это дает указание автозавершить, что завершение для vi для файлов, и удалить узоры, соответствующие фильтру -X . Минус в том, что образец не нормализован, поэтому ../data и вариации не будут совпадать.

Следующей лучшей функцией может быть пользовательская функция PROMPT _ COMMAND :

# associative arrays of non-autocomplete directories
declare -A noacdirs=([/myproject/data]=1 )

function _myprompt {
    [[ -n "${noacdirs[$PWD]}" ]] && {
       echo autocomplete off
       bind 'set disable-completion on'
    } || {
       echo autocomplete on
       bind 'set disable-completion off'
    }
} 

PROMPT_COMMAND=_myprompt

Эта функция отключает завершение (полностью) при нахождении в каталоге, но отключает его для каждого пути, а не только для файлов в этом каталоге.

Было бы более полезно выборочно отключить это для определенных путей, но я полагаю, что единственный способ - использовать функцию завершения по умолчанию (bash-4.1 и более поздние complete -D ) и много путаницы.

Это должно работать для вас, но это может иметь непреднамеренные побочные эффекты (т.е. изменения ожидаемого завершения в некоторых случаях):

declare -A noacdirs=([/myproject/data]=1 )

_xcomplete() {
    local cur=${COMP_WORDS[COMP_CWORD]} # the current token

    name=$(readlink -f "${cur:-./}")  # poor man's path canonify
    dirname=$(dirname "$name/.")

    [[ -n "${noacdirs[$dirname]}" ]] && {
        COMPREPLY=( "" )   # dummy to prevent completion
        return
    }
    # let default kick in
    COMPREPLY=()
}

complete -o bashdefault -o default -F _xcomplete vi

Это работает для завершения vi , другие команды могут быть добавлены по мере необходимости. Он должен остановить завершение для файлов в именованных каталогах независимо от пути или рабочего каталога.

Я считаю, что общий подход с complete -D заключается в динамическом добавлении функций завершения для каждой команды по мере ее появления. Также может потребоваться добавить complete -E (завершение имени команды, когда входной буфер пуст).


Обновить Вот гибридная версия PROMPT _ COMMAND и решения функции завершения, это немного проще понять и взломать я думаю:

declare -A noacdirs=([/myproject/data]=1 [/project2/bigdata]=1)

_xcomplete() {
    local cmd=${COMP_WORDS[0]}
    local cur=${COMP_WORDS[COMP_CWORD]} # the current token

    [[ -z "$cur" && -n "$nocomplete" ]] && {
        printf "\n(restricted completion for $cmd in $nocomplete)\n"  
        printf "$PS2 $COMP_LINE"
        COMPREPLY=( "" )   # dummy to prevent completion
        return
    }
    COMPREPLY=()       # let default kick in
}

function _myprompt {
    nocomplete=
    # uncomment next line for hard-coded list of directories
    [[ -n "${noacdirs[$PWD]}" ]] && nocomplete=$PWD
    # uncomment next line for per-directory ".noautocomplete"
    # [[ -f ./.noautocomplete ]] && nocomplete=$PWD
    # uncomment next line for size-based guessing of large directories
    # [[ $(stat -c %s .) -gt 512*1024 ]] && nocomplete=$PWD
} 

PROMPT_COMMAND=_myprompt
complete -o bashdefault -o default -F _xcomplete vi cp scp diff

Эта функция приглашения устанавливает переменную nocomplete при вводе одного из настроенных каталогов. Измененное поведение завершения запускается только в том случае, если переменная не пуста и , только когда вы пытаетесь выполнить из пустого ряда, таким образом разрешая завершение частичных имен (удалите условие -z «$ cur» , чтобы предотвратить полное завершение). Прокомментируйте две строки printf для бесшумной работы.

Другие параметры включают файл флага .noautocomplete , который можно коснуться в каталоге при необходимости; и угадывание размера каталога с использованием GNU stat . Можно использовать любой или все эти три варианта.

(Метод stat является только предположением , сообщаемый размер каталога увеличивается вместе с его содержимым, это «высокая отметка воды», которая обычно не уменьшается при удалении файлов без какого-либо административного вмешательства. Это дешевле, чем определить реальное содержимое потенциально большого каталога. Точное поведение и приращение для каждого файла зависит от базовой файловой системы. Я нахожу его надежным индикатором на linux ext2/3/4 систем по крайней мере.)

bash добавляет дополнительное пространство, даже когда возвращается пустое завершение (это происходит только при завершении в конце строки). Для предотвращения этого можно добавить -o nospace в команду complete .

Один оставшийся ниггль заключается в том, что если вы задокументируете курсор до начала маркера и нажмете вкладку, завершение по умолчанию снова начнется. Считайте это особенностью; -)

(Или вы могли бы обойти с $ {COMP _ LINE: $ COMP _ ПУНКТ 1: 1} , если вы любите сверхинженерию, но я нахожу, что сам bash не может установить переменные завершения надежно при резервном копировании и попытке завершения в середине команды.)

-121--23874-

Вы можете сделать это с помощью reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

Восстановить начальный вывод процесса можно позже, используя что-то вроде

reredirect -N -O <M> -E <N> <PID>

( < M > и < N > обеспечиваются предыдущим запуском reredirect).

reredirect РИДМИ также объясняет, как перенаправить на другую команду.

-121--73581-

Вы можете сделать это с помощью reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

Восстановить начальный вывод процесса можно позже, используя что-то вроде

reredirect -N -O <M> -E <N> <PID>

( < M > и < N > обеспечиваются предыдущим запуском reredirect).

reredirect РИДМИ также объясняет, как перенаправлять на другую команду или перенаправлять только stdout или stderr.

8
27.01.2020, 19:58

Это не возможно. Или по крайней мере не легкий. У Вас могла бы быть некоторая удача при присоединении gdb к процессу и игре с ним в gdb, но это может привести к катастрофическим отказам так же легко как успех.

3
27.01.2020, 19:58
  • 1
  • 2
    Не стесняйтесь совместно использовать их, я буду upvote :) –  Dennis Kaarsemaker 22.12.2012, 01:47
  • 3
    Гм, я уже сделал. –  Gilles 'SO- stop being evil' 22.12.2012, 02:03
  • 4
    Не совсем. Все инструменты, связанные в другой ошибке, о присоединении к другой сессии терминала/экрана. Не о перенаправлении в другой файл. Хотя это должно, вероятно, не трудно исправить reptyr для перенаправления в файл вместо этого. –  Dennis Kaarsemaker 22.12.2012, 02:11
  • 5
    я немного изучил источник reptyr, и я соглашаюсь больше всего с "не легкой" частью ответа. Мог бы взять более глубокое погружение в него некоторое время спустя. –  gertvdijk 04.01.2013, 12:24

Необходимо использовать reptyr для подключения другого процесса к новому текущему терминалу. Например: установка и использование GNU screen утилита, и в нем запускается reptyr управляйте, чтобы "выбрать" перенаправления другого процесса (и управление терминалом) и подключить их к новому текущему терминалу ( screen процесс, если Вы запустились reptyr от screen). Преимущество выполнения этого от a screen сессия - это, однажды под screen, затем будет легко разъединиться и снова соединиться с ним (например, закрыв Ваш локальный сеанс, хождение домой и повторное открытие его).

2
27.01.2020, 19:58
  • 1
    Спасибо за Ваш ответ, но это не помогает мне с моим случаем, поскольку я не спрашиваю о терминале detach/retach. Перечитайте мой вопрос и пример в определенном. –  gertvdijk 26.12.2012, 17:36
  • 2
    ах, в этом случае: прочитайте reptyr код, узнайте, как изменить его, чтобы только перенаправить stdout или stderr. Затем выполните его от другой оболочки, которая перенаправляет тот недавно присоединенный поток туда, где Вы хотите, чтобы это пошло? (или, лучше, с помощью reptyr источника, сделайте перенаправление непосредственно) –  Olivier Dulac 26.12.2012, 17:44

Теги

Похожие вопросы