Комбинирование cd и ls (macOS) не работает

Вопрос или проблема

Я искал в интернете и видел бесконечные вариации этой команды:

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
}
  1. Описание проблемы: При выполнении этой функции происходит переход в указанный каталог с помощью команды cd, но после выхода из функции текущий каталог остается прежним. Это связано с тем, что команды, выполненные в функции, работают в своем собственном окружении. Как только функция завершается, окружение уничтожается, и текущее положение остается неизменным.

  2. Проблемы с контекстом: Использование 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 не могут быть напрямую объединены для изменения рабочего каталога через функцию, которая находится в файле конфигурации оболочки. Однако, есть обходные пути и отладочные методы. Лучший подход зависит от вашего конкретного сценария использования, и, возможно, потребуется учитывать влияние ваших решений на остальную рабочую среду.

Оцените материал
Добавить комментарий

Капча загружается...