1

Есть ли способ передать завершающие n символов команды функции, чтобы она выполняла ее как две команды? Например, я определяю свою функцию как abcx и всякий раз, когда я вхожу

abcxfoo

в командной строке моя функция интерпретирует его как abcx foo . Я знаю о передаче аргументов, таких как $1 и $@ но в некоторых случаях однажды определенная функция, как та, что выше, может действительно сэкономить время.

Я имею в виду, что у меня есть много псевдонимов cd которые я хотел бы назвать как cdlinux , заставляя меня перейти на ~/Documents/Linux , без необходимости определения псевдонима для каждой отдельной папки в моем Document ( что я и сделал до настоящего времени).

2 ответа2

2

Вы не можете сделать это точно, но, немного поработав и выполнив bash 4, вы сможете реализовать эту функцию.

Когда bash 4 встречает неопределенную команду, она ищет функцию оболочки с именем command_not_found_handle и, если она находит ее, она вызывает ее, передавая имя необнаруженной команды как $1 а остальные аргументы как $2 ...

Таким образом, вы можете, например, обработать команды cd и ffdir , добавив что-то подобное в ваш файл .bashrc . (примечание: я не имею дело с нечувствительностью к регистру, так что еще есть над чем поработать.)

command_not_found_handle() {
  case $1 in
    cd*) if [[ -d "$HOME/Documents/${1#cd}" ]]; then
           cd "$HOME/Documents/${1#cd}"
           return 0
         fi
         # On failure, falls through to the error message
         ;;
    ffdir*) find . -type d -iname "${1#ffdir}"
            return 0
            ;;
    # Etc...
  esac

  # If nothing else works, just do what bash would have done
  printf "%s: command not found\n" "$1" >&2
  return 127
}
0

Нет. То, что вы просите, невозможно, как оболочка сможет угадать, где заканчивается имя функции? Ему нужно пробел, чтобы знать, что он должен пытаться интерпретировать то, что вы написали, как команду.

Однако, вероятно, вам нужна переменная окружения CDPATH :

CDPATH

Разделенный двоеточиями список каталогов, используемых в качестве пути поиска для встроенной команды cd.

Это используется cd следующим образом:

CD

  cd [-L|[-P [-e]]] [directory]

Измените текущий рабочий каталог на каталог. Если каталог не указан, используется значение переменной оболочки HOME. Если переменная оболочки CDPATH существует, она используется в качестве пути поиска. Если каталог начинается с косой черты, CDPATH не используется.

Другими словами, если вы установите CDPATH в вашем ~/.bashrc следующим образом:

export CDPATH=".:~/Documents"

После этого вы сможете использовать cd и использовать завершение табуляции для вывода списка всех подкаталогов ~/Documents как если бы вы уже были в ~/Documents .


Другой подход заключается в использовании функции. Просто добавьте это в ваш ~/.bashrc:

cddoc(){
    cd "$HOME/Documents/$1"
}

Это, однако, имеет тот недостаток, что завершение табуляции не будет работать. Вы можете обойти это, но это того не стоит, учитывая, что CDPATH , вероятно, именно то, что вы ищете.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .