Примерно каждый раз, когда я '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', чтобы оно изменилось на запрошенный каталог, а затем сделать что-то еще после этого?
источник
cd ""
(то, что этот ответ должен оценить, отличается отcd "$@"
пустого$@
. Извините за путаницу.Я думаю, что вы попали в петлю. Ваша
cd
функция вызываетcd
, которая является ... функцией.Вам нужно знать
builtin
, какое ключевое слово заставляет поиск команд использовать встроенные функции Bash, такие как cd, а не вашу функцию.Кроме того, вызов
/usr/bin/cd
никогда не будет работать, даже если такая команда существовала.Что случилось бы:
/bash/dir
./usr/bin/cd /dir/for/cd
./usr/bin/cd
идет в реж/dir/for/cd
./usr/bin/cd
выходы./bash/dir
, потому что дочерний процесс/usr/bin/cd
не может влиять на родительский процесс .Также псевдонимы - это простые текстовые замены. У них никогда не может быть параметров.
источник
builtin cd $@ && ls
; посколькуcd
вызов должен быть успешным, чтобы все остальное имело смысл. Также запомните особые случаи, такие какcd
(без аргументов).Я предлагаю не переопределять cd, потому что есть некоторые другие скрипты, угоняющие функцию 'cd', например, rvm. Было бы лучше выбрать другое имя, например, «d», и не указывать тип «встроенный» в вашей функции; в противном случае угонщик не будет функционировать. Я использую код ниже:
источник