Чи можна перевизначити командний рядок, вбудований в команду "cd"?


22

Майже кожен раз, коли я 'кд' в інший каталог на моєму комп'ютері (в даному випадку, запускається Mac OS X 10.6.7) за допомогою командного рядка (який bash), я відразу введіть 'ls', щоб отримати список вмісту \ t у цьому каталозі. Я намагаюся розібратися зі способом перевизначення "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", щоб він змінився на потрібний каталог, а потім виконати щось інше?

Відповіді:


30

Слід працювати з такими елементами:

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

Оскільки функція знаходиться в одному рядку, переконайтеся, що вона завершена ; як і вище, щоб працювати правильно.


Не працює для виклику без параметрів.
Daniel Beck

3
@DanielBeck - принаймні на моєму Mac OSX (10.6.7) він працює нормально з безпараметричним викликом. Поведінка полягає в тому, що вона змінюється на домашній каталог, а потім виконує список цих реж. Ефективно дублювати функціональність звичайного старого 'cd' з новою функцією, доданою в кінці.
Alan W. Smith

2
@Alan Правда, я перевірив це, написавши цей код спеціально в оболонці. Здається, поведінка Росії cd "" (до чого ця оцінка повинна оцінювати відрізняється від cd "$@" з порожнім $@. Вибачте за плутанину.
Daniel Beck

@DanielBeck - не турбуйтеся.
Alan W. Smith

2
Примітка: Я змінюю це на прийняту відповідь, оскільки це точна відповідь на питання. Один з @RichHomolka відмінно підходить для звернення до директора, але це саме те, що можна помістити у файл ~ / .bash_profile.
Alan W. Smith

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 не може впливати на батьківську.

Також псевдоніми є простими замінами тексту. Вони ніколи не мають параметрів.


я пропоную builtin cd $@ && ls; з cd виклик має бути успішним для того, щоб усе інше мав сенс. Також пам'ятайте про такі особливі випадки, як cd (немає аргументів).
Daniel Beck

Сторона Примітка: Я постарався позначити це як прийняту відповідь, але це розповідають мені я повинен зачекати ще 6 min перед тим, як я можу зробити що. Не знав, що є вбудована затримка, перш ніж ви могли б це зробити.
Alan W. Smith

@Alan Інше, краще рішення може виникнути в дуже розумний термін (тобто тих кількох хвилин, які потрібно чекати). Думаю, саме тому існує системна затримка: ви повинні віддавати перевагу якості над швидкістю. Це не повинно бути занадто багато незручностей.
Daniel Beck

І у нас є переможець. Це працює як чемпіон. Для @DanielBeck я змінив використання & amp; & amp; і конденсував його до одного рядка з: функція cd {вбудований cd "$ @" & amp; & amp; ls -l; }
Alan W. Smith

@DanielBeck - Так, я не хвилювався про це. Просто ніколи раніше цього не помічали. Я бачу в ньому логіку, просто трохи здивувала мене.
Alan W. Smith

6

Я пропоную не перезаписувати компакт-диск, тому що є деякі інші сценарії, які захоплюють функцію 'cd', наприклад, rvm. Краще було б вибрати іншу назву, наприклад 'd', і не вказувати тип 'вбудованої' у вашій функції; інакше викрадач не працюватиме. Я використовую код нижче:

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

Я думав, що це не спрацює, на думку ОП.
user305964
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.