Co jest równoważne z [alias cs = 'cd; ls'], ale z argumentem, że cs idzie na cd zamiast ls?

3

Na przykład chcę:

/tmp: $ cs /home

wykonać „cd / home; i podaj:

user1 user2 user3 egfile.txt
/home: $
Jan
źródło

Odpowiedzi:

8

Nie możesz przekazywać argumentów do aliasu, ale możesz do funkcji.

cs() {
cd "$@"
ls
}
garyjohn
źródło
5
Lepiej: cd "$@" && lsaby funkcja zwróciła stan niezerowy (i nie uruchomi się ls) w przypadku cdniepowodzenia. Jeszcze lepiej:, builtin cd "$@" && lsktóry nadal działa, nawet jeśli funkcja jest wywoływana cd.
Gilles
1

Łączenie odpowiedzi @garyjohn i @Gilles z interactive?czekiem i rozwinięcie lsformatowania wyjściowego.

Teraz możesz bezpiecznie dodać to do swojego ~/.bashrclub /etc/bash.bashrc:

Podstawowa wersja

#
# Replace every cd with cd+ls
#
if [[ $- == *i* ]]; then  # if running interactively
  cd() {
    builtin cd "$@" && ls
  }
fi

Urocza wersja

Filtruje dane wyjściowe lstak, aby wyświetlały się tylko rozmiar, czas i nazwa.

if [[ $- == *i* ]]; then  # if running interactively
  cd() {
    builtin cd "$@" &&
    ls --color=always -lh | 
    awk '{ for(i=5; i<=NF; i++) {printf("%s ", $i)}; print ""} '  | 
    column -t  && echo
  }
fi
Aleksandr Levchuk
źródło
IMHO, „interaktywny?” kontrole najlepiej wykonywać raz w pliku rc, z [ "$PS1" ] || returnlub [[ $- == *i* ]] || return, zamiast zawijać wszystko w bardzo duży plik if.
grawitacja
@grawity, zostawię czek w odpowiedzi, aby być bezpiecznym. Zarówno duże, jak ifi returnprawidłowe sposoby. Dziękuję za $-bardziej wiarygodną kontrolę. W końcu można używać powłoki interaktywnie bez pytania. $ PS zawsze wydawało mi się sztuczne.
Aleksandr Levchuk
Nawiasem mówiąc, nie potrzebujesz \ rur po &&/ ||operatorów.
grawitacja