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?

dv3500ea
źródło

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$
Izajasza
źródło
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
}
OneOfOne
źródło
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
16

Użyj funkcji zamiast aliasu:

cs() { cd "$1" && ls; }
Florian Diesch
źródło
5
+1, ponieważ ta wersja zatrzyma się, jeśli zawiedzie „cd”.
htorque
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.

dv3500ea
źródło
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; }.


źródło
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
DavidG
źródło