Вопрос или проблема
Я искал в интернете и видел бесконечные вариации этой команды:
function cdl {
builtin cd "$1" && ls -Gp%;
}
Я менял местами кавычки, точки с запятой, скобки, $@, использовал алиасы вместо функций, и единственное поведение, которое я когда-либо получал, это то, что оболочка выводит ls каталога, к которому пыталась выполнить cd, но оставляет меня там, где я начал. Похоже, что вместо этого просто выполняется ls PATH
.
Моя функция находится в ~/.bashrc, который загружается из моего .bash_profile. MacBook Pro, Sequoia.
Это работает прекрасно; но эффект имеет только место внутри самой функции. Как только вы покидаете функцию, рабочая директория снова возвращается к той, что была до входа в нее.
Как говорит Аркадиуш в комментарии, одним из обходных путей является алиас оболочки, если вам только это нужно в интерактивной оболочке.
Ответ или решение
Проблема использования комбинации команд cd
и ls
на macOS в вашей функции cdl
заключается в том, что они выполняются в контексте функции, и изменение рабочего каталога не сохраняется после её завершения. Давайте разберем ваши действия и предложим пути решения данной проблемы.
Разбор проблемы
Вы определили функцию в вашем файле ~/.bashrc
, которая выглядит так:
function cdl {
builtin cd "$1" && ls -Gp
}
-
Описание проблемы: При выполнении этой функции происходит переход в указанный каталог с помощью команды
cd
, но после выхода из функции текущий каталог остается прежним. Это связано с тем, что команды, выполненные в функции, работают в своем собственном окружении. Как только функция завершается, окружение уничтожается, и текущее положение остается неизменным. -
Проблемы с контекстом: Использование
ls
послеcd
в данном случае вывода не решает вашей проблемы, так как каждый раз, когда вы вызываете функциюcdl
, вы не меняете реальное состояние текущего каталога вашего терминала.
Решение
Чтобы добиться желаемого эффекта, вам следует рассмотреть два основных подхода:
1. Использование команды source
Один из способов – использование команды source
(или .
) для выполнения скрипта, в котором содержится ваша функция, напрямую в текущем окружении. Однако, в этом случае вам все равно придется использовать концепцию функции и возвращать управление пользователю по команде cd
.
source ~/.bashrc
2. Альтернатива с использованием псевдониса
Если вам нужно простое решение для интерактивного использования, вы можете создать псевдоним:
alias cdl='(cd $1 && ls -Gp)'
Но учтите, что данный подход также не изменит рабочий каталог, так как псевдонимы работают под тем же принципом, что и функции.
Рекомендации
Таким образом, наиболее эффективный метод – это написать небольшую оболочку для скрипта, которая применяет команду cd
для изменения директории, а затем вручную вызывает ls
:
cd() {
command cd "$1" && ls -Gp
}
Этот код переопределяет стандартную команду cd
, и после выполнения всех стандартных операций в ней (перехода в каталог) также выполняется вывод содержимого нового каталога. Учтите, что это может повлиять на всякий раз, когда вы используете команду cd
.
Заключение
Суть в том, что команды cd
и ls
не могут быть напрямую объединены для изменения рабочего каталога через функцию, которая находится в файле конфигурации оболочки. Однако, есть обходные пути и отладочные методы. Лучший подход зависит от вашего конкретного сценария использования, и, возможно, потребуется учитывать влияние ваших решений на остальную рабочую среду.