Могу ли я заставить bash игнорировать ведущий `:`, когда он присутствует?

Часто, если я работаю в bash (на macOS), я также работаю в (Mac) Vim, переключаюсь между ними. Общей ошибкой, которую я делаю после переключения с Vim на терминал, является включение ведущего двоеточия перед командой. Я буду :cd /path/to/project/dir/ в Vim, а затем переключитесь на Terminal и введите то же самое, за исключением, конечно, я не должен начинать с двоеточия.

Поэтому я не знаю, когда команда bash должна начинаться с двоеточия, и каждый раз, когда я это делаю, я не хочу этого делать. Итак, есть ли способ заставить bash полностью игнорировать двоеточие, если это первый символ в команде и интерпретировать :cd ... как cd ... ?

One Solution collect form web for “Могу ли я заставить bash игнорировать ведущий `:`, когда он присутствует?”

bash(1) вызовет функцию command_not_found_handle() если она определена, и команда, которая будет выполнена, не будет найдена. Если вы еще не используете эту функцию (например, с помощью пакета, не найденного командой на Ubuntu), вы можете использовать его для удаления двоеточия и повторите попытку:

 command_not_found_handle() { if [[ "${1:0:1}" != : ]]; then printf "%s: %s: command not found\n" "$0" "$1" >&2 return 127 else "${1/#:}" "${@:2}" fi } 

Поместите эту функцию в свой .bashrc . Затем, когда команда, начинающаяся с двоеточия, не найдена, она отключит колонку спереди и повторите попытку.

Edit: Я объясню немного дальше, так как здесь есть некоторые необычные расширения.

Прежде всего, как отмечено в комментариях, command_not_found_handle является функцией bash 4. Bash 4 был выпущен в феврале 2009 года. Функция command_not_found_handle вызывается с аргументами, которые не были найдены командой и аргументами этой команды. т.е. $1 – команда не найдена, а $2 – аргументы команды, которая не была найдена. Это описано в разделе « ИСТОРИЯ КОМАНДЫ» на странице руководства.

"${1:0:1}" является расширением, которое берет подстроку из $1 из позиции 0 длины 1. То есть, она извлекает первый символ из $1 , где $1 – это команда, которая не была найдена. Это описано в разделе « Расширение параметров» на странице руководства как ${parameter:offset:length} .

Если первый символ $1 не является двоеточием, мы печатаем сообщение об ошибке и возвращаем значение с результатом 127. 127 – это код выхода bash, когда он не находит команду для выполнения, как это описано в разделе « ИСТОРИЯ КОМАНДЫ» на странице руководства.

"${1/#:}" расширяется до $1 с удалением любого ведущего двоеточия. Если в начале нет двоеточия, это эквивалентно простой $1 , но мы знаем, что она начинается с двоеточия в любом случае из-за ветви условия, в котором мы находимся. Это расширение описано в разделе « Расширение параметров» на странице руководства в ${parameter/pattern/string} .

"${@:2}" расширяется до позиционных параметров со второго. Это расширение описано в разделе « Расширение параметров» на странице руководства в разделе ${parameter:offset} , в качестве специального случая для массивов и @ . То есть вместо извлечения подстроки он расширяется до элементов массива.

Конечным результатом является то, что если команда не найдена, и она имеет ведущий двоеточие, мы отменим двоеточие, чтобы сформировать новую команду и передать исходные аргументы новой команде. Это закончится тем, что работает рекурсивно, как если бы вторая попытка выполнить команду не найдена, команда command_not_found_handle() будет выполнена снова. Это означает, что вы можете запустить :::mkdir и он все равно закончит работу с mkdir .

  • Файлы tar для Linux менее 3 месяцев назад, используя дату в filename
  • существует ли простой / чистый способ сделать «пустую логическую переменную» оценкой «false» на скриптах bash?
  • Дефисы в переменных значениях (в bash)
  • понять порядок операций для расширения параметра bash
  • выход из петли infinte
  • Проблема с синтаксисом bash в командной строке
  • Не допускайте моргания текста / экрана при выполнении четких
  • как передать значение переменной, которая в другой переменной
  • Как написать небольшой журнал с bash?
  • Разместить работу в фоновом режиме без замораживания
  • Как использовать встроенный bash для замены вывода подоболочки или функции
  • Interesting Posts

    Функция автозаполнения Autojump не работает

    Назначение удивительной привязки клавиш для более чем 9 тегов

    Зачем нужен еще один блок IPv6?

    FreeBSD не Unix. Но его Unix-подобный Unix. Где же тогда основной Unix читает исходный код?

    Как изменить и построить порт Freebsd (e2fsprogs)

    Понимание нескольких сетевых интерфейсов и маршрутизации с использованием OpenWRT

    Создание привязки для прослушивания localhost в netns

    Как перенаправить максимальный результат на один процессор в файл?

    Как определить, присутствует ли строка в stdout, не влияя на вывод?

    Linux Mint file-chooser: показывать имя файла вместо строки пути?

    Изменить красную границу между окнами в xmonad

    tcpdump не захватывает трафик http или tcp / ssl

    Команда CLI для захвата области с задержкой?

    Использование головы и хвоста для захвата различных наборов строк и сохранения в один файл

    Переименование файлов с указанием имени пути

    Linux и Unix - лучшая ОС в мире.