Kann ich einen Terminalbefehl ändern, um zusätzliche Aufgaben auszuführen?

8

Ich habe mich mit Aliasnamen, Funktionen ... befasst, aber ich habe nichts Befriedigendes gefunden. Lassen Sie mich einige Szenarien nennen:

  • In 95% der Fälle, cdin denen ich mich in einem Ordner befinde, erhalte ich einen ls Befehl.
  • 90% der Fälle, in denen ich mkdir, ich cdselbst hinein.

Du hast die Idee.

Was wäre der "sauberste" Weg, um diese Befehle (oder andere Funktionen) zusammenzubinden?

Carles Alcolea
quelle
5
Warum haben Aliase bei Ihnen nicht funktioniert?
Thorbjørn Ravn Andersen
2
Sollte das CD-Ergebnis von mkdir dann das ls anheften?
bmike
@bmike Nun, ein neu erstelltes Verzeichnis ist leer, also druckt es nichts.
Random832
@ Random832 Sie nehmen keine Flags auf ls an, aber was noch wichtiger ist, meine Frage wird zeigen, wie gebrochen / schwerfällig eine Änderung gewünscht wird. Ich bevorzuge Aliase gegenüber Funktionen, aber beide können versuchen, was gefragt wird.
bmike
1
@ fd0 Ich bezweifle nicht, dass Aliase nicht funktioniert haben. Ich frage warum. Möglicherweise gibt es eine einfachere Lösung für das Problem.
Thorbjørn Ravn Andersen

Antworten:

4

Sie können diese Zeilen in Ihr .zsrhcoder einfügen.bashrc

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

Ergebnis ->

Geben Sie hier die Bildbeschreibung ein

Erklärung aus dieser Antwort :

Früher in meiner .bashrc habe ich: [-z "$ PS1"] && return, und alles nach dieser Zeile gilt nur für interaktive Sitzungen, sodass dies keinen Einfluss auf das Verhalten von CDs in Skripten hat.

Weitere Infos aus diesem Kommentar :

[-z "$ PS1"] prüft, ob $ PS (interaktive Eingabeaufforderungsvariable) "Nulllänge" (-z) ist. Wenn die Länge Null ist, bedeutet dies, dass sie nicht festgelegt wurde, sodass Bash nicht im interaktiven Modus ausgeführt werden darf. Unter diesen Bedingungen wird der && Rückgabeteil zu diesem Zeitpunkt aus der Beschaffung von .bashrc beendet.

Übrigens, danke für die Frage, es ist wirklich cool :)

Bearbeiten:

Eine andere Lösung wäre, Ihr ls in Ihre Eingabeaufforderung zu integrieren. Ich bin sicher, dass du das mit OhMyZsh machen kannst;)

StrawHara
quelle
1
Verwenden Sie im Allgemeinen nicht denselben Namen wie Standardbefehle wie cd ls rm usw., da Sie diese Standardbefehle verwenden müssen
user151019
@ Mark Ich bin einverstanden für 'rm -rf ~ / *' ^^ Aber für einen CD-Befehl ist es nicht wirklich gefährlich. Und Carles möchte 'vorhandene Befehle aktualisieren', also ...
StrawHara
Ich muss sagen, dass ich diese Lösung verwendet habe, seit @StrawHara sie veröffentlicht hat und ich 0 Probleme hatte. Ich wollte das "wie es lief" liefern :) Und es ist wirklich nützlich; So benutze ich es (.zshrc): i.imgur.com/WHpROIE.png
Carles Alcolea
13

Ich würde dazu neigen, einen neuen Befehl dafür zu machen. Ich denke, es wäre sogar logisch, sie zu einer einzigen zu kombinieren.

go() {
    if [ -d "$1" ]; then
        cd "$1" && ls
    else
        mkdir -p "$1" && echo "Created directory $1" && cd "$1"
    fi
}
Random832
quelle
Ich mag deine Idee, diese zu kombinieren! :-)
Martin Allert
5
Diese Antwort ist auch die sauberste, da sie die Standarddefinition von cd / mkdir bei Verwendung durch Skripte nicht stört
holroy
1
Sicher, aber was ist, wenn Sie sich für die Verwendung der Programmiersprache Go entscheiden? : P
Arxanas
@arxanas: Du benutzt Makefiles? ;-)
DevSolar
2
hmmm ich mag diesen. Wenn Sie den Namen jedoch versehentlich falsch eingeben, erstellen Sie ein neues Verzeichnis. Ist es schwer , einen Scheck auf eine leave (cd zu implementieren /.... oder ../oder etwas) und löschen Sie das Verzeichnis , wenn es leer ist? Ich meine, wenn Sie ein Verzeichnis verlassen, überprüfen Sie einfach, ob es leer ist, und löschen Sie es, wenn ja. Wenn Sie das nicht wollen, können Sie immer noch CD verwenden, anstatt zu gehen
Schwertspize
6

Ich habe versucht, solche Dinge zu meinem hinzuzufügen .bashrc:

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

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

Ich habe jedoch festgestellt, dass dies Skripte, die die überschriebenen Befehle verwenden, durcheinander bringen kann und die Optionsbehandlung fragil sein kann (wenn Sie beispielsweise -pan den obigen mkdirBefehl übergeben möchten , wird sie auch an übergeben cd). Besser wäre es, nur Aliase mit unterschiedlichen Namen zu definieren (z. B. coder mcd).

Arxanas
quelle
1
Das Einfügen [ -z "$PS1" ] && returnam Ende der Datei vor diesen Funktionen sollte helfen
Carles Alcolea
5

Ich denke, Funktionen sind der richtige Weg. Etwas wie

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

als Beispiel.

fd0
quelle