Відповіді:
З підказки Баша: '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; }
Дякую Флоріану Діешу за пораду використання функції. Я не можу використовувати 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