staging.inyokaproject.org

"Langen Alias" in .bash_aliases anlegen

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

Speedy-10

Avatar von Speedy-10

Anmeldungsdatum:
23. März 2010

Beiträge: 917

Hallo, ich möchte einen alias anlegen:

alias letzte = "find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's#.list$##;s#.*/##' | sort "

Wenn ich aber danach ein Terminal öffne, bekomme ich sofort die Meldung:

bash: alias: letzte: Nicht gefunden.
bash: alias: =: Nicht gefunden.
bash: alias: find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's#.list0#;s#.*/##' | sort : Nicht gefunden.

Wie könnte ich das lösen?

In der .bashrc steht u.a.:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Hi,

Du darfst keine Leerezichen hinter dem Alias setzen:

alias letzte="find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's#.list$##;s#.*/##' | sort "

Speedy-10

(Themenstarter)
Avatar von Speedy-10

Anmeldungsdatum:
23. März 2010

Beiträge: 917

danke. Leider erhalte ich noch eine Fehlermeldung:

:~$ letzte 
sed: -e Ausdruck #1, Zeichen 9: Nicht beendeter `s'-Befehl

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Das Ersetzen von / in Sedbefehlen durch beliebige, andere Trenner ist entweder nicht trivial, oder das Triviale daran ist mir noch nicht klar geworden. Ist mir auch schon passiert, dass es nicht klappt aber die Regelmäßigkeit, nach der es nicht klappt, habe ich noch nicht ergründet.

Mit Slashes und Maskierung geht's:

1
alias letzte="find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's/.list$//;s/.*\///' | sort"

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Das Problem ist, dass das "$#" von der Shell als Variable ersetzt wird. (immerhin hast Du ja mit "doppelten Gänsefüßchen" gequotet !)
(Du siehst das schön in der Fehlermeldung, dass an der Stelle eine 0 steht ! → es wurden 0 Parameter angehängt.)

Das "#" als Trenner bei sed ist in der Hinsicht etwas tückisch ... deshalb nehme ich als alternativen Trenner auch immer nur das "|", das sieht man deutlicher, und es gibt keine solchen Interferenzen. 😉

LG,

track

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14402

Doc_Symbiosis schrieb:

Du darfst keine Leerezichen hinter dem Alias setzen:

Doch, das darf man schon. Z. B.:

alias sudo='sudo '

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

user_unknown schrieb:

Das Ersetzen von / in Sedbefehlen durch beliebige, andere Trenner ist entweder nicht trivial, oder das Triviale daran ist mir noch nicht klar geworden.

In diesem Fall ist das Problem das Dollarzeichen:

1
2
3
4
$ echo $#
0
$ echo $/
$/

Ist mir auch schon passiert, dass es nicht klappt aber die Regelmäßigkeit, nach der es nicht klappt, habe ich noch nicht ergründet.

Problematisch sind halt immer Zeichen, die Metabedeutungen in der Shell haben oder mit solchen interagieren (wie in diesem Fall).

Mit Slashes und Maskierung geht's:

Man muss auch nur das Dollarzeichen maskieren, weil es in der Kombination $# in einer Zeichenkette mit doppelten Anführungsstrichen expandiert wird. Das reicht.

Es zeigt sich mal wieder, dass set -x ein hervorragendes Werkzeug zum Finden solcher Pannen ist. So habe ich das untersucht:

1
2
3
4
5
6
7
8
9
$ set -x
+ set -x
$ alias letzte="find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's#.list$##;s#.*/##' | sort "
+ alias 'letzte=find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed '\''s#.list0#;s#.*/##'\'' | sort '
$ letzte
+ sed 's#.list0#;s#.*/##'
+ sort
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
sed: -e expression #1, char 13: unknown option to `s'

In Zeilen 4 und 6 sieht man, dass da auf einmal eine Null auftaucht, die nicht in der Alias-Definition steht. Mit Maskierung geht es:

1
2
3
4
5
6
7
$ alias letzte="find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's#.list\$##;s#.*/##' | sort "
+ alias 'letzte=find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed '\''s#.list$##;s#.*/##'\'' | sort '
$ letzte
+ sed 's#.list$##;s#.*/##'
+ sort
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
...

Man kann auch das Quoting komplett auf einfache Anführungsstriche umstellen, was aber ein wenig mühsam ist:

1
2
3
4
5
6
7
$ alias letzte='find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed '\''s#.list$##;s#.*/##'\'' | sort'
+ alias 'letzte=find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed '\''s#.list$##;s#.*/##'\'' | sort'
$ letzte
+ sed 's#.list$##;s#.*/##'
+ sort
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
...

Oder man nimmt eine Shell-Funktion

1
2
3
4
5
6
7
8
$ letzte(){ find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's#.list$##;s#.*/##' | sort; }
+ sed 's#.list$##;s#.*/##'
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
$ letzte
+ sed 's#.list$##;s#.*/##'
+ sort
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
...

Die Ausgaben habe ich immer abgeschnitten.

Speedy-10

(Themenstarter)
Avatar von Speedy-10

Anmeldungsdatum:
23. März 2010

Beiträge: 917

Vielen Dank, läuft alles.

Den Befehl hatte ich von einer ubuntuusers.de-Seite, weiß aber nicht mehr welche. Vielleicht sollte es dort dann auch ergänzt werden.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Speedy-10 schrieb:

Vielen Dank, läuft alles.

👍

Ich hoffe, Du hast auch etwas gelernt dabei. ☺

Den Befehl hatte ich von einer ubuntuusers.de-Seite, weiß aber nicht mehr welche. Vielleicht sollte es dort dann auch ergänzt werden.

Ich habe gesucht und Systeminformationen ermitteln (Abschnitt „Updates-Installationen“) gefunden. Da steht es nicht als Alias. Insofern gibt es da auch nichts zu ergänzen. Du hast Dir das ja erst selbst "eingebrockt", weil Du den Befehl als Alias speichern willst. 😉

Speedy-10

(Themenstarter)
Avatar von Speedy-10

Anmeldungsdatum:
23. März 2010

Beiträge: 917

Danke, war sehr ausführlich!

Dachte, man könnte evtl. einen funktionierenden alias dort auf https://wiki.ubuntuusers.de/Systeminformationen_ermitteln/#Updates-Installationen anlegen (ggf. in Klammer ergänzen) oder auf diesen Beitrag verweisen. Die meisten User werden sich den komplizierten Audruck eher nicht merken können ☺, daher hilft nur ein Browser-Lesezeichen, in der Terminal-History suchen mit 'strg+r' oder eben einen alias anlegen.

Antworten |