Bash: Leerzeichen im Aliasnamen

115

Ich versuche, Aliase in Bash zu erstellen. Was ich tun möchte , ist Karte ls -lazuls -la | more

In meiner .bashrc-Datei habe ich Folgendes versucht:

alias 'ls -la'='ls -la | more'

Es funktioniert jedoch nicht, da (ich nehme an) Leerzeichen im Aliasnamen enthalten sind. Gibt es eine Lösung dafür?

Sixtyfootersdude
quelle
8
Warum nichtalias lsm='ls -la | more'
Nifle

Antworten:

125

In der Bash-Dokumentation heißt es: "Für fast alle Zwecke werden Shell-Funktionen Aliasen vorgezogen." Hier ist eine Shell-Funktion, die lsdie Ausgabe ersetzt und dazu führt, dass sie weitergeleitet wird, morewenn das Argument aus (nur) besteht -la.

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

Als Einzeiler:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Ausgabe automatisch leiten:

ls -la
Dennis Williamson
quelle
1
Warum müssen Sie in der if-Anweisung doppelte Klammern verwenden?
Sixtyfootersdude
1
@sixtyfootersdude: Die Doppelklammerform ist mächtiger und ich benutze sie aus Gewohnheit. Siehe mywiki.wooledge.org/BashFAQ/031
Dennis Williamson
Also, was ist der letzte Befehl? alias ls = 'ls ()' ??
Jeef
1
@Jeef: Nein, meine Antwort verwendet eine Funktion anstelle eines Alias. Ich habe es bearbeitet, um es klarer zu machen.
Dennis Williamson
6
@merlinpatt: commandVerhindert, dass die Funktion rekursiv aufgerufen wird.
Dennis Williamson
52

Aus der Alias-Manpage :

Das erste Wort jedes einfachen Befehls wird, wenn es nicht in Anführungszeichen gesetzt ist, überprüft, um festzustellen, ob es einen Alias ​​hat. In diesem Fall wird dieses Wort durch den Text des Alias ​​ersetzt. Der Aliasname und der Ersetzungstext können alle gültigen Shell-Eingaben enthalten, einschließlich Shell-Metazeichen, mit der Ausnahme, dass der Aliasname möglicherweise kein "=" enthält.

Daher wird nur das erste Wort auf Alias-Übereinstimmungen überprüft, wodurch Mehrwort-Aliase unmöglich werden. Möglicherweise können Sie ein Shell-Skript schreiben, das die Argumente überprüft und Ihren Befehl aufruft, wenn sie übereinstimmen, und andernfalls nur das Normal aufruft ls(siehe Antwort von @Dennis Williamson ).

heavyyd
quelle
8
+1 Um zu erklären, warum ich ls -la nicht als Alias ​​verwenden darf.
Sixtyfootersdude
7
Dies war hilfreich, da es die Frage nicht löste, sondern beantwortete. Ich bin hierher gekommen, weil ich einen Alias ​​mit einem Leerzeichen erstellen wollte, und das wird einfach nicht passieren.
Angryundead
Dies beantwortete nicht nur meine Frage, sondern gab mir wertvolle Einblicke in die Wirkungsweise des Aliasing-Mechanismus. Ihr Zitat aus der Manpage war sehr hilfreich.
Lily Finley
14

Ein leicht verbesserter Ansatz aus Dennis 'Antwort:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

Oder der Einzeiler:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

So können beispielsweise nach dem Befehl weitere Optionen / Argumente angehängt werden ls -la -h

ld_pvl
quelle
2
Wie geht das, wenn ich ls -latvon dieser Behandlung ausgeschlossen werden möchte ? Ich müsste einen Fall über den -la*Eintrag stellen, ja?
Steven Lu
-1

Sie können diesen Alias ​​weiterhin aufrufen, benötigen jedoch ein Anführungszeichen, damit das Leerzeichen Teil des Befehlsworts ist. So "ls -la" -p patternwird die -p patternOption morenicht weitergegeben ls.

Charles Stewart
quelle