22

Примерно каждый раз, когда я 'cd' в другой каталог на моем компьютере (в данном случае, под управлением Mac OS X 10.6.7) через командную строку (это bash), я сразу же набираю 'ls', чтобы получить список содержимого. в этом каталоге. Я пытаюсь найти способ переопределить 'cd', чтобы он изменился на запрошенный каталог и затем выдал мне список за один раз.

Мне удалось получить базовую функциональность, над которой я работаю, добавив следующую строку в мой ~/.bash_profile

function cl() { cd "$@"; ls -l; }

Это работает как ожидалось. Перейдя в запрошенный каталог, а затем показывая мне содержимое. Когда я сталкиваюсь с проблемой, я пытаюсь переопределить сам "cd" вместо создания новой команды "cl".

Следующие вещи не работают

##### Attempt 1 #####
# Hangs the command line

function cd() { cd "$@"; ls -l; }


##### Attempt 2 #####
# Hangs the command line

function cd() { 'cd' "$@"; ls -l; }


##### Attempt 3 #####
# Does not change directory. 
# Does list contents, but of the directory where you started.

function cd() { /usr/bin/cd "$@"; ls -l; }


#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;

Я также попробовал несколько других итераций, которые не перечислены, а также создал псевдоним, который указывает на работающую функцию 'cl'. Ни один из которых не работал.

То, что я прочитал в документации, говорит о том факте, что «cd» не может быть запущен как внешняя команда (как я понимаю, это то, как функция должна была бы использовать ее).

Таким образом, в настоящее время я могу использовать свою команду "cl" и получить то, что хочу, но вопрос в том / остается:

Есть ли способ переопределить поведение 'cd', чтобы оно изменилось на запрошенный каталог, а затем сделать что-то еще после этого?

3 ответа3

30

Следующее должно работать:

function cd() { builtin cd "$@" && ls -l; }

Поскольку функция находится в одной строке, убедитесь, что она завершена ; как указано выше для правильной работы.

10

Я думаю, что вы попали в петлю. Ваша функция cd вызывает cd , то есть ... функцию, которую вы должны знать о builtin являющемся ключевым словом, которое заставляет поиск команд использовать встроенные функции Bash, такие как cd, а не вашу функцию

function cd
{
    builtin cd "$1"
    : do something else
}

Кроме того, вызов /usr /bin /cd никогда не будет работать, даже если такая команда существовала.

Что случилось бы:

  • Моя оболочка Bash находится в каталоге dir /bash /dir

  • Я запускаю команду /usr/bin/cd /dir/for/cd

  • /usr /bin /cd переходит в dir /dir /for /cd

  • /usr /bin /cd выходит.

  • Bash все еще находится в /bash /dir, потому что дочерний процесс /usr /bin /cd не может влиять на родительский.

Также псевдонимы - это простые текстовые замены. У них никогда не может быть параметров.

6

Я предлагаю не переопределять cd, потому что есть некоторые другие скрипты, угоняющие функцию 'cd', например, rvm. Было бы лучше выбрать другое имя, например, «d», и не указывать тип «встроенный» в вашей функции; в противном случае угонщик не будет функционировать. Я использую код ниже:

function d() { cd "$@" && ls;} 

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