Як я можу створити псевдонім для CD та ls?


32

Я часто запускаю lsкоманду після запуску cdкоманди. Як я можу створити псевдонім (як cs) для цієї операції?

Відповіді:


35

З підказки Баша: '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$

1
Це не вдасться для каталогів, що містять пробіл. Дивіться коментар до відповіді dv3500ea.
geirha

24

Ви можете використовувати builtinкоманду в bash:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}

2
Це досить гладко. Я дуже довго мав рішення, подібне до @Florian у своєму.
дино,

Мені подобається ця відповідь найкраще. Чомусь ви не можете використовувати псевдоніми, щоб перезаписати команду, тому вам доведеться зробити функцію, як ця відповідь. : D
trusktr

А як щодо невбудованих команд? Наприклад, вищезгадане не буде працювати для заміни команди ls. Чи потрібно використовувати якесь ключове слово замість "вбудованого"?
trusktr

використовуйте повний шлях для нього, наприклад:function ls() { /usr/bin/ls $* }
OneOfOne

У мене виникли проблеми з переосмисленням, cdоскільки rvmзмінюється і моє cdвизначення. Див stackoverflow.com/a/19941991/1601989
DavidG

16

Використовуйте функцію замість псевдоніма:

cs() { cd "$1" && ls; }

5
+1, оскільки ця версія припиниться, якщо 'CD' не вдасться.
htorque

9

Дякую Флоріану Діешу за пораду використання функції. Я не можу використовувати csяк ім'я, оскільки csв пакеті csound є команда , тому я використовував lc.

Я додав це до ~/.bash_aliases( nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

Термін повинен бути resetтаким, щоб це вступило в силу.


8
Якщо $1не буде цитовано це, це призведе до помилки, якщо каталог містить пробіли. Також слід перевірити значення повернення cd; якщо це не вдалося (наприклад, у дозволі відмовлено), немає сенсу запускати ls.lc() { cd "$@" && ls; }
geirha

1

В якості розширення для цієї функції: cs() { cd "$1" && ls; }ви можете передати всі аргументи функції , щоб cd, використовуючи $@замість того , щоб "$1"як такої: cs() { cd $@ && ls; }.


1

У мене виникли проблеми з переосмисленням, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.