Ответы:
Вы можете сделать это с помощью функции:
$ 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:
С зш:
chpwd() ls
Функция chpwd () вызывается zsh при каждом изменении текущего каталога (посредством 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:
cd /
(files listed)
cd /home
(files listed)
etc...
В bash вы не можете использовать псевдонимы для действий, для которых требуется параметр. Для этого есть функции. Так что вставьте в ваш ~/.bashrc
следующий
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" }
.
Поместите приведенный ниже код в .profile, и он работает. Протестировано на HP-Unix box.
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'