Wie trage ich den alias korrekt ein? [gelöst]

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Wie trage ich den alias korrekt ein? [gelöst]

Beitrag von Duff » 24.07.2007 20:40:23

Hallo,

wie muss ich folgenden alias korrekt eintragen?

Code: Alles auswählen

alias ors=`awk 'BEGIN { if ( ARGC==1 ) { print "Usage: $0 <file>";exit } } ORS = /^$/ ? "\n\n" : " "'`
Der alias kann ohne Probleme, also ohne Fehlermeldung, auf der Konsole so eingegeben werden. Möchte ich ihn jedoch aufrufen, bekomme ich die Fehlermeldung:

Code: Alles auswählen

su: Syntax error: `newline or ;' is not expected.
Was muss ich alles escapen?
Zuletzt geändert von Duff am 25.07.2007 09:06:56, insgesamt 1-mal geändert.
Oh, yeah!

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 24.07.2007 20:57:17

In single quotes einschließen ...

Code: Alles auswählen

alias name='<command>'
und dann eben korrekt escapen etc.

Markus

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 24.07.2007 21:40:45

Ok, hatte ich auch schon versucht.

Aber was muss ich alles escapen?
Alle ", '? Oder noch mehr?
Oh, yeah!

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Beitrag von 123456 » 24.07.2007 21:48:12

Ich glaube das Problem ist eher ein anderes...Du kannst beim alias keine Backticks verwenden - nur ' oder auch " - beides hast Du aber schon verwendet, dann klappt das nicht wegen der Umschliessung. Schreib doch einfach ein Einzeiler Bash Skript.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 24.07.2007 22:50:02

ub13 hat geschrieben:Schreib doch einfach ein Einzeiler Bash Skript.
Genau das wohlte ich eigentlich vermeiden, damit ich nicht so viele "kleine" Skripte habe. Deshalb der Versuch dieses aliases ;-(
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 24.07.2007 23:30:19

der Sinn von dem Statement ist mir zwar nicht klar, aber so könnte es möglicherweise das tun, was du möchtest:

Code: Alles auswählen

gms1 tmp # alias ors="awk 'BEGIN { if ( ARGC==1 ) { print \"Usage: $0 <file>\";exit } } ORS = /^$/ ? \"\\n\\n\" : \" \"'"
gms1 tmp # ors
Usage: /bin/bash <file>
Warum hast du die Backticks überhaupt in dem alias drinnen?

Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 25.07.2007 09:06:27

gms hat geschrieben: Warum hast du die Backticks überhaupt in dem alias drinnen?
Ja, dass war wohl ein übler Denkfehler von mir. Ich brauche die Backticks ja eigentlich nur, wenn ich mir z.B. in einem alias das Datum mit `date ...` ausgeben lassen will.
gms hat geschrieben:der Sinn von dem Statement ist mir zwar nicht klar, aber so könnte es möglicherweise das tun, was du möchtest:

Code: Alles auswählen

gms1 tmp # alias ors="awk 'BEGIN { if ( ARGC==1 ) { print "Usage: $0 <file>";exit } } ORS = /^$/ ? "\\n\\n" : " "'"
gms1 tmp # ors
Usage: /bin/bash <file>
Ich benötige das Statement (nur) für config-Dateien. Da ich aus diesen Dateien schon mal öfter 2, 3 Zeilen benötige und bei einem grep nur die Zeile mit dem Suchkriterium finde und nicht die dazugehörigen Zeilen darüber oder darunter.

Nochmals Danke!
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 25.07.2007 09:54:10

Duff hat geschrieben:
ub13 hat geschrieben: Schreib doch einfach ein Einzeiler Bash Skript.
Genau das wohlte ich eigentlich vermeiden, damit ich nicht so viele "kleine" Skripte habe. Deshalb der Versuch dieses aliases ;-(
dafür hätte ich einen Vorschlag, schreib dir doch EIN Shell-Script (ähnlich wie eine Library) mit den entsprechenden Funktionen:

Code: Alles auswählen

gms2 ~ # cat x-lib.sh

ors() {
  awk 'BEGIN { if ( ARGC==1 ) { print "Usage: $0 <file>";exit } } ORS = /^$/ ? "\n\n" : " "' "$@"
}
gms2 ~ # source x-lib.sh
gms2 ~ # ors
Usage: $0 <file>
Dieses Shell-Script kannst du dann in deinem Profile "sourcen". Komplexe Funktionen sind auch normalerweise leserlicher als komplexe Aiases. Weiters haben Funktionen den Vorteil, daß sie wiederverwendbar sind, also in anderen Funktionen verwendet werden können.

Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 25.07.2007 09:59:15

gms hat geschrieben:
Duff hat geschrieben:
ub13 hat geschrieben: Schreib doch einfach ein Einzeiler Bash Skript.
Genau das wohlte ich eigentlich vermeiden, damit ich nicht so viele "kleine" Skripte habe. Deshalb der Versuch dieses aliases ;-(
dafür hätte ich einen Vorschlag, schreib dir doch EIN Shell-Script (ähnlich wie eine Library) mit den entsprechenden Funktionen:

Code: Alles auswählen

gms2 ~ # cat x-lib.sh

ors() {
  awk 'BEGIN { if ( ARGC==1 ) { print "Usage: $0 <file>";exit } } ORS = /^$/ ? "\n\n" : " "' "$@"
}
gms2 ~ # source x-lib.sh
gms2 ~ # ors
Usage: $0 <file>
Dieses Shell-Script kannst du dann in deinem Profile "sourcen". Komplexe Funktionen sind auch normalerweise leserlicher als komplexe Aiases. Weiters haben Funktionen den Vorteil, daß sie wiederverwendbar sind, also in anderen Funktionen verwendet werden können.

Gruß
gms
Ok, nochmals zum Verständnis: Ich kann in dem Shell-Skripts x-lib.sh verschiedene Funktionienen einbauen, wie u.a. die Funktion ors(). Wenn ich dann anschließend ein source x-lib.sh mache, kann ich die einzelnen Funktionen aus dem Shell-Skript direkt über den Funktionsnamen aufrufen.

Was genau bewirkt denn das source? Kann dazu bei mir keinen manual-Eintrag finden.

Diese Variante scheint auf jeden Fall sinnvoller zu sein. Allein schon was die Lesbarkeit betrifft, wie du schon erwähnt hast.
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 25.07.2007 10:43:02

Ok, nach ein wenig suche, konnte ich den Befehl dann doch im manual der bash finden:
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe-
cuted from filename. If filename does not contain a slash, file
names in PATH are used to find the directory containing file-
name. The file searched for in PATH need not be executable.
When bash is not in posix mode, the current directory is
searched if no file is found in PATH. If the sourcepath option
to the shopt builtin command is turned off, the PATH is not
searched. If any arguments are supplied, they become the posi-
tional parameters when filename is executed. Otherwise the
positional parameters are unchanged. The return status is the
status of the last command exited within the script (0 if no
commands are executed), and false if filename is not found or
cannot be read.
Damit doch das ganze auch beim Neuanmelden funktioniert, muss ich in meine .bashrc noch den Eintrag source x-lib.sh eintragen, oder?
Sonst dürfte mein System die Befehle aus der Datei x-lib.sh nicht kennen.

Das nächste Problem ist, dass die ksh den source-Befehl nicht kennt.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 25.07.2007 11:24:36

Duff hat geschrieben: Das nächste Problem ist, dass die ksh den source-Befehl nicht kennt.
so ist es "portabler" und funktioniert auch unter ksh:

Code: Alles auswählen

.  /pfad/zu/x-lib.sh
Vorsicht: nach dem Punkt muß ein Abstand sein!

Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 25.07.2007 13:06:32

gms hat geschrieben:
Duff hat geschrieben: Das nächste Problem ist, dass die ksh den source-Befehl nicht kennt.
so ist es "portabler" und funktioniert auch unter ksh:

Code: Alles auswählen

.  /pfad/zu/x-lib.sh
Vorsicht: nach dem Punkt muß ein Abstand sein!

Gruß
gms
Ok, danke.

Aber das

Code: Alles auswählen

.  /pfad/zu/x-lib.sh
sollte ich doch dann auch in meine .profile schreiben, damit ich die Befehle/die Funktionsaufrufe aus dem Shell-Skript auch nach einem ausloggen und einloggen wieder verwenden kann.

[edit]
Blöde Frage. Ja so funktioniert es mit einem Eintrag in die .profile.
Nochmals vielen Dank!!!
[/edit]
Oh, yeah!

Antworten