Czy mogę zmodyfikować polecenie terminala, aby wykonać dodatkowe czynności?

8

Sprawdziłem aliasy, funkcje ... ale nie znalazłem niczego satysfakcjonującego. Pozwól, że dam ci kilka scenariuszy:

  • 95% razy, kiedy cdprzechodzę do folderu, wykonuję ls polecenie.
  • 90% przypadków, ja mkdir, ja cdsię do niego.

Masz pomysł.

Jaki byłby „najczystszy” sposób powiązania tych poleceń (lub innej funkcjonalności)?

Carles Alcolea
źródło
5
Dlaczego aliasy nie działały dla Ciebie?
Thorbjørn Ravn Andersen
2
Więc czy wynik cd mkdir powinien następnie przylgnąć do ls?
bmike
@bike Cóż, nowo utworzony katalog będzie pusty, więc nic nie drukuje.
Random832
@ Random832 nie zakładasz żadnych flag na ls, ale co ważniejsze, moje pytanie ujawni, jak pożądana jest zmiana w przypadku złamania / ciężkiej ręki. Wolę aliasy niż funkcje, ale oba mogą wypróbować to, o co pytają.
bmike
1
@ fd0 Nie wątpię, że aliasy nie działały. Pytam dlaczego. Problem może być prostszy.
Thorbjørn Ravn Andersen

Odpowiedzi:

4

Możesz umieścić te linie w swoim .zsrhclub.bashrc

[ -z "$PS1" ] && return
function cd {
builtin cd "$@" && ls -F
}

Wynik ->

wprowadź opis zdjęcia tutaj

Wyjaśnienie z tej odpowiedzi :

Wcześniej w moim .bashrc mam: [-z "$ PS1"] && return, a wszystko po tym wierszu dotyczy tylko sesji interaktywnych, więc nie wpływa to na zachowanie cd w skryptach.

Więcej informacji z tego komentarza :

[-z „$ PS1”] sprawdza, czy $ PS (interaktywna zmienna zachęty) ma „zerową długość” (-z). Jeśli ma zerową długość, oznacza to, że nie została ustawiona, więc Bash nie może działać w trybie interaktywnym. W tym momencie część && return wychodzi z sourcingu .bashrc.

Btw, dzięki za pytanie, to naprawdę fajne :)

Edytować :

Innym rozwiązaniem byłoby zintegrowanie ls z monitem; Jestem pewien, że możesz to zrobić za pomocą OhMyZsh;)

StrawHara
źródło
1
Zasadniczo nie używaj tej samej nazwy jako standardowych poleceń jako cd ls rm itp., Ponieważ będziesz musiał użyć tych standardowych poleceń
user151019 23.0915
@ Mark Zgadzam się na 'rm -rf ~ / *' ^^ Ale w przypadku polecenia cd nie jest to naprawdę niebezpieczne. A Carles chce „uaktualnić istniejące polecenia”, więc ...
StrawHara,
Muszę powiedzieć, że korzystałem z tego rozwiązania od czasu opublikowania go przez @StrawHara i miałem 0 problemów. Chciałem podać „jak poszło” :) I to jest naprawdę przydatne; tak go używam (.zshrc): i.imgur.com/WHpROIE.png
Carles Alcolea
13

Wydałbym za to nowe polecenie. Myślę, że logiczne byłoby nawet połączenie ich w jedno.

go() {
    if [ -d "$1" ]; then
        cd "$1" && ls
    else
        mkdir -p "$1" && echo "Created directory $1" && cd "$1"
    fi
}
Losowo 832
źródło
Podoba mi się twój pomysł połączenia tych! :-)
Martin Allert
5
Ta odpowiedź jest również najczystsza, ponieważ nie zakłóca domyślnej definicji cd / mkdir, gdy jest używana przez skrypty
holroy 21.09.19
1
Jasne, ale co, jeśli zdecydujesz się na korzystanie z języka programowania Go? : P
arxanas
@arxanas: Używasz makefiles? ;-)
DevSolar
2
hmmm Podoba mi się ten. ale jeśli przypadkowo wpiszesz nazwę, utworzysz nowy katalog. Czy trudno jest wdrożyć kontrolę na urlopie (CD /.... lub ../czy coś) i usunąć katalog jeśli jest pusta? Mam na myśli, że jeśli opuścisz katalog, po prostu sprawdź, czy jest pusty, a jeśli tak, usuń go. jeśli tego nie chcesz, możesz nadal używać cd zamiast go
Schwertspize
6

Próbowałem dodać takie rzeczy do mojego .bashrc:

cd() {
    command cd "$@"
    command ls
}

mkdir() {
    command mkdir "$@"
    command cd "$@"
}

Odkryłem jednak, że może to zepsuć skrypty, które używają przesłoniętych poleceń, a obsługa opcji może być delikatna (na przykład, jeśli chcesz przejść -pdo powyższego mkdirpolecenia, jest ono również przekazywane cd). Lepiej byłoby po prostu zdefiniować aliasy o różnych nazwach (powiedzmy club mcd).

arxanas
źródło
1
wstawienie [ -z "$PS1" ] && returnna końcu pliku, przed tymi funkcjami, powinno pomóc
Carles Alcolea,
5

Myślę, że funkcje są do zrobienia. Coś jak

chglist() {
    cd "$1" && ls
}

jako przykład.

fd0
źródło