Зробити CD автоматично ls


46

Я вважаю, що часто роблю таке:

%> cd bla/bla
%> ls

Мені б хотілося, щоб кожен раз, коли я cdпотрапляв у каталог, він автоматично робив ls.

Я .bashrcдеякий час поспілкувався зі своїм , але не зміг зрозуміти, як це зробити.

Відповіді:


50

Це можна зробити за допомогою функції:

$ cdls() { cd "$@" && ls; }

В &&означає « cdв директорії, і в разі успіху (наприклад , каталог існує), запуск ls». Використовувати &&оператор краще, ніж використовувати ;оператор крапки з комою між двома командами, як і у випадку { cd "$@" ; ls; }. Ця друга команда буде виконуватися lsнезалежно від того, cdпрацювала чи ні. Якщо cdне вдалося, lsнадрукує вміст вашого поточного каталогу, що буде заплутаним для користувача. Як найкраща практика, використовуйте, &&а не ;.

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

Взагалі, погана практика перейменовувати команду, яка вже існує, особливо для загальновизваної команди типу cd. Натомість створіть нову команду з іншою назвою. Якщо ви перезапишете cdфункцію чи псевдонім, який також названий cd, що буде, коли ви введете каталог із 100 000 файлами? Є багато комунальних служб, які використовують cd, і вони можуть заплутатися від цієї незвичної поведінки. Якщо ви використовуєте спільний обліковий запис (наприклад, rootколи ви працюєте з іншими системними адміністраторами), замінити існуючу команду може бути дуже небезпечно, оскільки середовище відрізняється від того, що очікують люди.


Ця команда дійсно змінює каталог? З сторінки чоловіка bash: "Немає механізму використання аргументів у тексті заміни. Якщо потрібні аргументи, слід використовувати функцію оболонки"
enzotib

@enzotib: Так, це дійсно змінює каталог, принаймні для мене. Я оновив свою відповідь, щоб показати вихід pwd. Не впевнений, чи це найкраща практика, але зазвичай це робиться. Див. Tldp.org/LDP/abs/html/aliases.html кілька прикладів.
Стефан Ласєвський

2
По-перше: це не працює. По-друге: на цій сторінці вони використовують змінні, а не позиційні параметри. По-третє: ABS є поширеним джерелом поганих практик.
enzotib

1
Псевдонім працює для мене на Snow Leopard, але не на CentOS5 або CentOS6. Я оновив свою відповідь, щоб використовувати лише функцію. Ніяких псевдонімів.
Стефан Ласєвський

1
Не працює для мене. Пробував @frabjous відповіді , і він працює: cd() { builtin cd "$@" && pwd; };- з використанням стандартної оболонки Bourne на MacOS (Sierra 10.12.6)
шарнір

39

У мене це є .bashrc, і він чудово працює.

function cd {
    builtin cd "$@" && ls -F
    }

Раніше в моєму .bashrc я мав:, [ -z "$PS1" ] && returnі все після цього рядка стосується лише інтерактивних сесій, тому це не впливає на те, як cdповодиться у сценаріях.


1
Що саме робить [ -z "$PS1" ] && return?
синтагма

2
[ -z "$PS1" ]перевіряє, чи є $PS(інтерактивна змінна підказка) "нульовою довжиною" (-z). Якщо вона дорівнює нулю, це означає, що вона не була встановлена, тому Bash не повинен працювати в інтерактивному режимі. && returnЧастина виходить з пошуку .bashrcв цієї точці, в цих умовах.
frabjous

1
Інший спосіб перевірити інтерактивність шукати iв "$-": case "$-" in *i*) ;; *) return ;; esac.
Kusalananda

@Kusalananda & frabjous: Чи є випадки, коли один слід використовувати замість іншого?
Поворот

1
@Swivel PS1Змінна може бути не налаштована або порожньою, і оболонка може бути інтерактивною (але без підказки). Я би перевірив, $-щоб переконатися.
Kusalananda

13

поза темою, оскільки питання позначено тегами / bash, але оскільки деякі питання закриті як дублікати цього, у якому не згадується bash:

З zsh:

chpwd() ls

Zsh викликає функцію chpwd () кожного разу, коли змінюється поточний каталог (за допомогою cd, pushd, popd ...). tcsh має подібну особливість і, ймовірно, звідки це отримав zsh.


4

Чому б не додати псевдонім до файлу .bashrc?

Щось на зразок:

alias cdls='cd "$@" && ls'

@don_crissti Функція та псевдонім - це різні речі. То чому б і ні?
Жодка Лимон

Це найшвидший і найчистіший спосіб зробити те, про що вимагала ОП. На мою думку, функції слід використовувати для більш складних речей, а створення ярликів для часто введених команд - це саме те, для чого існують псевдоніми.
Ghos3t

У мене виникає дивна проблема з цим псевдонімом, коли я використовую його так, cdls projec2, він покаже всі файли в папці Project 2, але насправді не буде CD у цій папці, натомість він залишиться у вихідній папці.
Ghos3t

2

Поширене рішення створення псевдоніму для команди CD не є ідеальним, оскільки існують інші команди, які можуть змінити поточну каталог, наприклад popd або навіть запустити скрипт із командою cd у ньому.

Краще використовувати $ PROMPT_COMMAND Баш-гачок, який виконує команду перед поверненням запиту.

Команда (функція в нашому випадку) буде виконувати ls, лише якщо каталог змінився, щоб зменшити шум на екрані. Код для .bashrc:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd

2

Скопіюйте це:

altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd 

Тепер ви просто можете зробити простий компакт-диск:

cd / 
(files listed)
cd /home 
(files listed)
etc... 

1

У bash ви не можете повторити псевдоніми для дій, які потребують параметра. Для цього існують функції. Тому вкажіть ~/.bashrcнаступне

mycd() {
  cd "$1"
  ls
}


Щоб дозволити параметр для команди ls, я використовую функцію mycd {buildin cd $ 1 && ls $ 2}. Тепер ви можете зателефонувати в команду, наприклад, mycd .. -la
Крістіан

@ChristianSchulzendorff: краще використовувати лапки: function mycd { builtin cd "$1" && ls "$2" } .
enzotib

Не працює, я просто спробував. Файл був порожнім, але після додавання коду нічого не змінилося.
Чорний

0

Розмістіть наведений нижче код у .profile, і він працює. Тестовано на коробці HP-Unix.

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"

0

Ще зручніше - з можливістю повернутися в історію :

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

При зміні каталогу відобразиться рядок з:, Stack: (current_dir) (previous_dir) ...а потім lsвиведете. Щоб повернутися в історії директорій просто попи цієї команди: popd.

Я додав, elseтож ви побачите помилку при спробі перейти в неправильний каталог.


якщо ви просто зробите компакт-диск - це приведе вас до останнього редактора, в якому ви були.
Ян

0

Я думаю, що добре включити lsпараметри таким чином, оскільки cdне має жодної можливості.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}

Гм ... cdдійсно приймає варіанти.
Kusalananda

0

Ось що мені здається корисним (на Debian 9):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

Це дає мені усічений вихід з еліпсісом, якщо в цьому каталозі занадто багато елементів, щоб консоль залишався чистим:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977

-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'

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