Jak mogę utworzyć alias dla CD i LS?


32

Często uruchamiam lspolecenie po uruchomieniu cdpolecenia. Jak mogę utworzyć alias (jak cs) dla tej operacji?

Odpowiedzi:


35

Z porad i wskazówek Bash: „cd” ze stylem :

Na koniec chcę pokazać, jak napisać własny niestandardowy zamiennik dla polecenia „cd”.

Czy po przejściu do katalogu zawsze piszesz to samo? Prawdopodobnie przynajmniej za każdym razem wyświetlasz listę plików, być może do tego stopnia, że ​​twoje ręce automatycznie wpisują „ls” po każdym „cd”.

Cóż, próbując wszystkich sposobów, jakie mogłem wymyślić, okazuje się, że jest tylko jeden sposób, aby właściwie osiągnąć cel, którego szukamy. Musimy stworzyć funkcję powłoki.

Funkcje powłoki są częścią programowania powłoki. Podobnie jak w skompilowanych językach programowania funkcje zapewniają rodzaj modułowej modularyzacji. Można stworzyć ogólną funkcję do wykonywania często używanego bitu logiki lub obliczeń z różnymi parametrami. W tym przypadku parametrem jest bieżący katalog roboczy.

Oto prosty:

function cs () {
    cd $1
    ls
}

Jak słusznie zauważa @geirha, powyższa funkcja zawiedzie, jeśli spróbujesz przełączyć się do katalogu ze spacją w nazwie:

$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>  

Zamiast tego należy użyć następującej funkcji:

function cs () {
    cd "$@" && ls
    }

Po dodaniu tego kodu do swojego kodu ~/.bashrcpowinieneś móc to zrobić:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$

1
To się nie powiedzie w przypadku katalogów zawierających białe znaki. Zobacz komentarz do odpowiedzi dv3500ea.
geirha

24

Możesz użyć builtinpolecenia w bash:

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

2
To całkiem sprytne. Przez bardzo długi czas miałem rozwiązanie podobne do @Florian w moim .bashrc, ale jest to o wiele bardziej satysfakcjonujące, gdy zapominam, że koledzy nie mają mojego aliasu „cs” na swoich komputerach.
dino

Najbardziej podoba mi się ta odpowiedź. Z jakiegoś powodu nie możesz użyć aliasów, aby zastąpić polecenie, więc musisz wprowadzić funkcję taką jak ta odpowiedź. : D
trusktr

Ale co z niewbudowanymi poleceniami? Na przykład powyższe nie zadziała w przypadku zastąpienia polecenia ls. Czy istnieje jakieś słowo kluczowe do użycia zamiast „wbudowanego”?
trusktr

użyj do tego pełnej ścieżki, na przykład:function ls() { /usr/bin/ls $* }
OneOfOne

Miałem problemy z przedefiniowaniem, cdponieważ zmieniłem także rvmmoją cddefinicję. Zobacz stackoverflow.com/a/19941991/1601989
DavidG


9

Dzięki Florian Diesch za wskazówkę dotyczącą korzystania z funkcji. Nie mogę użyć csjako nazwy, ponieważ csw pakiecie csound znajduje się polecenie , więc użyłem go lc.

Dodałem to do ~/.bash_aliases( nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

Aby to zadziałało, musi być terminal reset.


8
Bez $1cudzysłowu spowoduje, że nie powiedzie się, jeśli katalog zawiera spacje. Ponadto powinieneś sprawdzić wartość zwracaną cd; jeśli się nie powiedzie (np. odmowa dostępu), nie ma sensu uruchamiać ls. lc() { cd "$@" && ls; }
geirha

1

Jako rozszerzenie do tej funkcji: cs() { cd "$1" && ls; }może chcesz przekazać wszystkich argumentów funkcja do cdstosując $@zamiast "$1"jako takie: cs() { cd $@ && ls; }.


1

Miałem problemy z przedefiniowaniem, cdponieważ zmieniłem także rvmmoją cddefinicję. Zobacz https://stackoverflow.com/a/19941991/1601989 . Tak naprawdę nie chciałem używać, builtinponieważ pomijałoby rvmto, co robi.

Dodałem następujące do mojego .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
}

A potem po rmvwierszu w .bashrc:

alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.