Как я могу создать псевдоним для компакт-дисков и ls?

32

Я часто запускаю lsкоманду после запуска cdкоманды. Как я могу создать псевдоним (как cs) для этой операции?

dv3500ea
источник

Ответы:

35

Из 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$
Исайя
источник
1
Это не удастся для каталогов, содержащих пробелы. Смотрите комментарий к ответу dv3500ea.
Гейра
24

Вы можете использовать builtinкоманду в bash:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}
OneOfOne
источник
2
Это довольно гладко. У меня было решение, похожее на @Florian, в моем .bashrc в течение очень долгого времени, но это гораздо более удовлетворительно, когда я забываю, что у коллег нет псевдонима "cs" на их компьютерах.
Дино
Мне нравится этот ответ лучше всего. По какой-то причине вы не можете использовать псевдонимы для перезаписи команды, поэтому вы должны создать такую ​​функцию, как этот ответ. : 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

Спасибо Florian Diesch за подсказку по использованию функции. Я не могу использовать csв качестве имени, потому что csв пакете csound есть команда , поэтому я использовал lc.

Я добавил это к ~/.bash_aliases( nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

Терминал должен быть resetдля того, чтобы это вступило в силу.

dv3500ea
источник
8
После $1некотируемой как это будет делать это ошибкой , если каталог содержит пробела. Кроме того, вы должны проверить возвращаемое значение cd; если это не удалось (например, отказано в разрешении), нет смысла запускать ls. lc() { cd "$@" && ls; }
Гейра
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
DavidG
источник