Как создать псевдоним bash для команды "cd ~ 1" - PullRequest
1 голос
/ 20 октября 2019

В BASH я использую команду «pushd.», Чтобы сохранить текущий каталог в стеке. После выполнения этой команды в нескольких разных каталогах у меня в стеке сохранено несколько каталогов, которые я могу увидеть, выполнив команду "dirs". Например, вывод команды "dirs" в моем текущем сеансе bash приведен ниже -

0 ~ / eclipse / src
1 ~ / eclipse
2 ~ / parboil / src

Теперь, чтобы переключиться на 0-й каталог, я запускаю команду "cd ~ 0". Я хочу создать команду псевдонима bash или функцию для этой команды. Что-то вроде «xya 0», которое переключится на 0-й каталог в стеке. Я написал следующую функцию для достижения этой цели -

xya () {
cd ~ $ 1
}

Где "$ 1" в функции выше, это первый аргумент, переданный функции"xya".

Но я получаю следующую ошибку -

-bash: cd: ~ 1: Нет такого файла или каталога

Подскажите, пожалуйстачто здесь не так?

Ответы [ 2 ]

3 голосов
/ 20 октября 2019

Обычно анализ bash выполняется в следующем порядке:

  • расширение скобки
  • расширение тильды
  • параметр, переменная, арифметическое расширение;подстановка команд (та же фаза, слева направо)
  • разбиение слов
  • расширение пути

Таким образом, к тому времени, когда ваш параметр будет расширен, расширение тильды будетуже завершено и больше не произойдет, не делая явных действий, таких как eval.


Если вы знаете риски и готовы принять их, используйте eval принудительно возобновить синтаксический анализ в начале после завершения $1. Приведенное ниже пытается смягчить ущерб, если что-то, что не является eval -безопасным, передается в качестве аргумента:

xya() {
  local cmd
  printf -v cmd 'cd ~%q' "$1"
  eval "$cmd"
}

... или, менее осторожно (то есть, что ниже доверяет вашемуаргументы должны быть eval -безопасными):

xya() {
  eval "cd ~$1"
}
0 голосов
/ 20 октября 2019

Вы можете позволить dirs напечатать абсолютный путь для вас:

xya(){
    cd "$(dirs -${1-0} -l)"
}
...