Ответы:
Из Bash Советы и хитрости: «CD» со стилем :
Наконец, я хочу показать вам, как написать собственную замену для команды 'cd'.
Считаете ли вы себя всегда печатать одно и то же при переходе в каталог? Вы, вероятно, по крайней мере перечисляете файлы там каждый раз, возможно, настолько, что ваши руки автоматически набирают «ls» после каждого «cd».
Что ж, пытаясь всеми возможными способами, оказывается, что есть только один способ правильно достичь цели, к которой мы стремимся. Мы должны создать функцию оболочки.
Функции оболочки являются частью программирования оболочки. Как и в скомпилированных языках программирования, функции обеспечивают своего рода процедурную модульность. Можно создать универсальную функцию для выполнения часто используемой части логики или вычислений с различными параметрами. В этом случае параметр является текущим рабочим каталогом.
Вот простой:
function cs () { cd $1 ls }
Как с сожалением отмечает @geirha , приведенная выше функция завершится ошибкой, если вы попытаетесь переключиться на каталог с пробелом в его имени:
$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>
Вместо этого вы должны использовать следующую функцию:
function cs () {
cd "$@" && ls
}
Как только вы добавите этот код к себе ~/.bashrc
, вы сможете сделать это:
hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Вы можете использовать builtin
команду в bash:
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cd
потому что rvm
менялось и мое cd
определение. См stackoverflow.com/a/19941991/1601989
Используйте функцию вместо псевдонима:
cs() { cd "$1" && ls; }
Спасибо Florian Diesch за подсказку по использованию функции. Я не могу использовать cs
в качестве имени, потому что cs
в пакете csound есть команда , поэтому я использовал lc
.
Я добавил это к ~/.bash_aliases
( nano ~/.bash_aliases
):
function lc () {
cd $1;
ls
}
Терминал должен быть reset
для того, чтобы это вступило в силу.
$1
некотируемой как это будет делать это ошибкой , если каталог содержит пробела. Кроме того, вы должны проверить возвращаемое значение cd
; если это не удалось (например, отказано в разрешении), нет смысла запускать ls
. lc() { cd "$@" && ls; }
В качестве расширения для этой функции: cs() { cd "$1" && ls; }
вы можете передать все аргументов функции , чтобы cd
, используя $@
вместо того , чтобы "$1"
как таковой: cs() { cd $@ && ls; }
.
У меня были проблемы с переопределением, cd
потому что rvm
меняются и мои cd
определения. См. Https://stackoverflow.com/a/19941991/1601989 . Я действительно не хотел использовать, builtin
потому что это пропустило бы то, что rvm
делает.
Я добавил следующее к своему .bashrc
:
# cdd allows you to cd to the directory of the given file or directory
function cdd()
{
if [[ $# -eq 0 ]]; then
cd
elif [[ -d "$*" ]]; then
cd "$*"
elif [[ -f "$*" ]]; then
echo "WARNING: file given, cd to file's dirname" 1>&2
local dir=$(dirname "$*")
cd "$dir"
else
cd "$*"
fi
}
function cs()
{
cdd $* && ls
}
А затем после rmv
строки в .bashrc
:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd