Бесконечный рекурсивный алиасинг `cd` - PullRequest
1 голос
/ 26 марта 2012

Я хочу записать свои самые последние cd на любом из моих терминалов.Я подумал, что хороший способ сделать это - написать простой скрипт bash, обертывающий cd:

#!/bin/bash
cd $1 && echo `pwd` > /tmp/.cwd

Поскольку я хочу, чтобы cd происходил в процессе моего терминала, мне нужно запустить скриптс . bettercd.sh, верно?

Вот моя проблема: если я псевдоним cd к этому новому . bettercd.sh, моя оболочка также расширяет cd внутри скрипта с помощью . bettercd.sh -бесконечная рекурсия.

Есть ли способ вызвать cd с другого имени, но с тем же поведением?Другими словами, есть ли какая-нибудь команда, которая ведет себя точно (или очень похоже на) cd, которую я могу использовать в своем сценарии оболочки, не замечая различий при использовании псевдонима cd изо дня в день?

Моя оболочка по выбору zsh, если это имеет какое-то отношение.

Спасибо за вашу помощь.

Ответы [ 6 ]

6 голосов
/ 26 марта 2012

Поскольку вы используете zsh, вы можете использовать builtin cd вместо cd. Это заставляет оболочку использовать встроенную команду вместо рекурсивного вызова вашего псевдонима.

builtin не существует в стандартной оболочке Bourne. Если вам нужно, чтобы это работало в других оболочках, попробуйте добавить в качестве префикса cd обратную косую черту, например: \cd. Он работает для обхода псевдонимов, но не для функций оболочки.

5 голосов
/ 26 марта 2012

zsh предоставляет функции хука chpwd_functions специально для таких инструментов, как этот. Если вы определите функцию для добавления нового каталога в файл и добавления функции в массив chpwd_functions, она будет автоматически запускать процедуру при каждом изменении каталога - будь то pushd popd или cd :

$ record_pwd() { pwd > /tmp/cwd }
$ chpwd_functions=(record_pwd)   
$ cd /tmp ; cat /tmp/cwd
/tmp
$ cd /etc ; cat /tmp/cwd
/etc
$ 
2 голосов
/ 26 марта 2012

В дополнение к уже опубликованным ответам (я лично предпочел бы ответ @ sarnold), вы можете использовать тот факт, что chdir в zsh имеет то же поведение, что и cd, но это не псевдоним, который вы можете определить с помощьюalias (это может быть «псевдоним» в исходном коде C, я не знаю), поэтому его использование безопасно.

2 голосов
/ 26 марта 2012

Внутри вашего скрипта вызов cd с builtin:

#!/bin/bash
builtin cd $1 && echo `pwd` > /tmp/.cwd
0 голосов
/ 26 марта 2012

Я бы предложил другое имя, чтобы избежать именно этого - что если какой-то другой сценарий сделает CD - если он использует вашу версию вместо «обычной», это может привести к ошибкам с системой.

0 голосов
/ 26 марта 2012

Вы можете попробовать поставить unalias cd на вершину вашего bettercd.sh

...