Відповіді:
Це можна зробити за допомогою функції:
$ 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
коли ви працюєте з іншими системними адміністраторами), замінити існуючу команду може бути дуже небезпечно, оскільки середовище відрізняється від того, що очікують люди.
pwd
. Не впевнений, чи це найкраща практика, але зазвичай це робиться. Див. Tldp.org/LDP/abs/html/aliases.html кілька прикладів.
cd() { builtin cd "$@" && pwd; };
- з використанням стандартної оболонки Bourne на MacOS (Sierra 10.12.6)
У мене це є .bashrc, і він чудово працює.
function cd {
builtin cd "$@" && ls -F
}
Раніше в моєму .bashrc я мав:, [ -z "$PS1" ] && return
і все після цього рядка стосується лише інтерактивних сесій, тому це не впливає на те, як cd
поводиться у сценаріях.
[ -z "$PS1" ] && return
?
[ -z "$PS1" ]
перевіряє, чи є $PS
(інтерактивна змінна підказка) "нульовою довжиною" (-z). Якщо вона дорівнює нулю, це означає, що вона не була встановлена, тому Bash не повинен працювати в інтерактивному режимі. && return
Частина виходить з пошуку .bashrc
в цієї точці, в цих умовах.
i
в "$-"
: case "$-" in *i*) ;; *) return ;; esac
.
PS1
Змінна може бути не налаштована або порожньою, і оболонка може бути інтерактивною (але без підказки). Я би перевірив, $-
щоб переконатися.
поза темою, оскільки питання позначено тегами / bash, але оскільки деякі питання закриті як дублікати цього, у якому не згадується bash:
З zsh:
chpwd() ls
Zsh викликає функцію chpwd () кожного разу, коли змінюється поточний каталог (за допомогою cd, pushd, popd ...). tcsh має подібну особливість і, ймовірно, звідки це отримав zsh.
Чому б не додати псевдонім до файлу .bashrc?
Щось на зразок:
alias cdls='cd "$@" && ls'
Поширене рішення створення псевдоніму для команди 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
Скопіюйте це:
altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd
Тепер ви просто можете зробити простий компакт-диск:
cd /
(files listed)
cd /home
(files listed)
etc...
У bash ви не можете повторити псевдоніми для дій, які потребують параметра. Для цього існують функції. Тому вкажіть ~/.bashrc
наступне
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" }
.
Розмістіть наведений нижче код у .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"
Ще зручніше - з можливістю повернутися в історію :
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
тож ви побачите помилку при спробі перейти в неправильний каталог.
Я думаю, що добре включити ls
параметри таким чином, оскільки cd
не має жодної можливості.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cd
дійсно приймає варіанти.
Ось що мені здається корисним (на 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
alias cd='builtin cd $1 && ls -l && builtin cd $1'