Как привести нечувствительные к регистру аргументы CD?

Хотя идя немного отличающийся от вопроса OP, когда я намеренно не хочу, чтобы команда была сохранена в истории удара, я снабжаю префиксом их пространство. Работы в Ubuntu и ее вариантах, не уверенных, если это работает над всеми системами.

9
04.01.2013, 18:48
2 ответа

Включение cdspell поможет:

shopt -s cdspell

От man страница:

cdspell, Если установлено, незначительные ошибки в написании компонента каталога в команде CD будут исправлены. Ошибки, проверенные на, являются транспонированными символами, мисс - символ луга и один символ слишком многие. Если исправление найдено, исправленное имя файла печатается, и доходы команды. Эта опция только используется интерактивными оболочками.

17
27.01.2020, 20:04
  • 1
    необходимо ли сделать что-нибудь после выполнения этой команды для изменения для вступления в силу? –  Nathan ReinstateMonica Arthur 08.01.2016, 18:00
  • 2
    , который я принял бы поэтому, потому что, просто входя shopt-s cdspell ничего не делает для меня –  I am ok 21.03.2017, 07:45

Bash

set completion-ignore-case on в ~/.inputrc (или bind 'set completion-ignore-case on' в ~/.bashrc) была бы моя рекомендация. Если Вы собираетесь ввести полное имя, почему передумали относительно нескольких нажатий клавиши Shift?

Но если Вы действительно хотите это, вот обертка вокруг cd это пробует за точное совпадение, и если нет ни одного, не ищет нечувствительное к регистру соответствие и выполняет его, если это уникально. Это использует nocaseglob опция оболочки для нечувствительного к регистру globbing, и превращает аргумент в шарик путем добавления @() (который ничему не соответствует и требует extglob). extglob опция должна быть включена при определении функции, иначе колотить, не может даже проанализировать его. Эта функция не поддерживает CDPATH.

shopt -s extglob
cd () {
  builtin cd "$@" 2>/dev/null && return
  local options_to_unset=; local -a matches
  [[ :$BASHOPTS: = *:extglob:* ]] || options_to_unset="$options_to_unset extglob"
  [[ :$BASHOPTS: = *:nocaseglob:* ]] || options_to_unset="$options_to_unset nocaseglob"
  [[ :$BASHOPTS: = *:nullglob:* ]] || options_to_unset="$options_to_unset nullglob"
  shopt -s extglob nocaseglob nullglob
  matches=("${!#}"@()/)
  shopt -u $options_to_unset
  case ${#matches[@]} in
    0) # There is no match, even case-insensitively. Let cd display the error message.
      builtin cd "$@";;
    1)
      matches=("$@" "${matches[0]}")
      unset "matches[$(($#-1))]"
      builtin cd "${matches[@]}";;
    *)
      echo "Ambiguous case-insensitive directory match:" >&2
      printf "%s\n" "${matches[@]}" >&2
      return 3;;
  esac
}

Ksh

В то время как я в нем, вот подобная функция для ksh93. ~(i) измененный для нечувствительного к регистру соответствия, кажется, является несовместимым с / снабдите суффиксом для соответствия каталогам только (это может быть ошибкой в моем выпуске ksh). Таким образом, я использую другую стратегию, для избавлений от некаталогов.

cd () {
  command cd "$@" 2>/dev/null && return
  typeset -a args; typeset previous target; typeset -i count=0
  args=("$@")
  for target in ~(Ni)"${args[$(($#-1))]}"; do
    [[ -d $target ]] || continue
    if ((count==1)); then printf "Ambiguous case-insensitive directory match:\n%s\n" "$previous" >&2; fi
    if ((count)); then echo "$target"; fi
    ((++count))
    previous=$target
  done
  ((count <= 1)) || return 3
  args[$(($#-1))]=$target
  command cd "${args[@]}"
}

Zsh

Наконец, вот zsh версия. Снова, разрешение нечувствительного к регистру завершения является, вероятно, наилучшим вариантом. Следующая установка отступает к нечувствительному к регистру globbing, если нет никакого соответствия точного случая:

zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'

Удалить '' показать все нечувствительные к регистру соответствия, даже если существует соответствие точного случая. Можно установить это от интерфейса меню compinstall.

cd () {
  builtin cd "$@" 2>/dev/null && return
  emulate -L zsh
  setopt local_options extended_glob
  local matches
  matches=( (#i)${(P)#}(N/) )
  case $#matches in
    0) # There is no match, even case-insensitively. Try cdpath.
      if ((#cdpath)) &&
         [[ ${(P)#} != (|.|..)/* ]] &&
         matches=( $^cdpath/(#i)${(P)#}(N/) ) &&
         ((#matches==1))
      then
        builtin cd $@[1,-2] $matches[1]
        return
      fi
      # Still nothing. Let cd display the error message.
      builtin cd "$@";;
    1)
      builtin cd $@[1,-2] $matches[1];;
    *)
      print -lr -- "Ambiguous case-insensitive directory match:" $matches >&2
      return 3;;
  esac
}
10
27.01.2020, 20:04
  • 1
    Здорово. Но необходимо будет добавить его к inputrc чтобы это работало. Как это: echo "set completion-ignore-case on" >> ~/.inputrc –  jsejcksn 08.01.2016, 06:10
  • 2
    @JesseJackson Да, который был неявен здесь, потому что автор вопроса уже знал, но я добавлю его к своему ответу для будущих посетителей. –  Gilles 'SO- stop being evil' 08.01.2016, 17:34
  • 3
    я получаю следующую ошибку при попытке использовать CD с этим: cd:cd:17: no such file or directory: videos (Мне назвали dir Videos) –  Sridhar Sarnobat 22.10.2016, 22:46
  • 4
    @user7000 Который версия, под который оболочка? –  Gilles 'SO- stop being evil' 22.10.2016, 22:48
  • 5
    @user7000 для меня под zsh 5.0.7. Возможно, Вы установили опцию, которая изменяет путь globbing работы? Помогает, изменяетесь ли Вы emulate -L zsh кому: emulate -LR zsh? (По тому, как я просто исправил ошибку, которая должна была быть emulate -L zsh, нет emulate zsh, иначе это испортило бы Ваши опции оболочки.) –  Gilles 'SO- stop being evil' 23.10.2016, 02:05

Теги

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