Вот простой путь, который приходит на ум
echo 'GET / HTTP/1.1
Host: google.com
' | openssl s_client -quiet -connect google.com:443 2>/dev/null
Это не идеально, но затем снова 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 не может установить переменные завершения надежно при резервном копировании и попытке завершения в середине команды.)
Вы можете сделать это с помощью reredirect ( https://github.com/jerome-pouiller/reredirect/ ).
reredirect -m /dev/null <PID>
Восстановить начальный вывод процесса можно позже, используя что-то вроде
reredirect -N -O <M> -E <N> <PID>
( < M >
и < N >
обеспечиваются предыдущим запуском reredirect).
reredirect РИДМИ
также объясняет, как перенаправить на другую команду.
Вы можете сделать это с помощью 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.
Это не возможно. Или по крайней мере не легкий. У Вас могла бы быть некоторая удача при присоединении gdb к процессу и игре с ним в gdb, но это может привести к катастрофическим отказам так же легко как успех.
Необходимо использовать reptyr для подключения другого процесса к новому текущему терминалу. Например: установка и использование GNU screen
утилита, и в нем запускается reptyr
управляйте, чтобы "выбрать" перенаправления другого процесса (и управление терминалом) и подключить их к новому текущему терминалу ( screen
процесс, если Вы запустились reptyr
от screen
). Преимущество выполнения этого от a screen
сессия - это, однажды под screen
, затем будет легко разъединиться и снова соединиться с ним (например, закрыв Ваш локальный сеанс, хождение домой и повторное открытие его).