Если бы я устанавливаю Linux на карте флэш-памяти USB, это стало бы живым USB?

Это не идеально, но затем снова 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 

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

reredirect -N -O  -E  

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

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

-121--73581-

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

reredirect -m /dev/null 

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

reredirect -N -O  -E  

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

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

1
21.11.2018, 23:32
1 ответ

Все мои USB являются «нормальными» устанавливаются. Если у вас есть установка CD / DVD, вы сможете установить на свой USB-накопитель или USB HDD без проблем. Если вы установили на регулярный жесткий диск, вы должны быть в состоянии клонировать это на USB тоже, что я делаю, так как я использую USB в качестве резервных копий.

0
28.01.2020, 01:47

Теги

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