lionlizard
Anmeldungsdatum: 20. September 2012
Beiträge: 6244
Wohnort: Berlin
|
Wenn ich aufrufe stepfahn@lubu16:~$ dump sda4 |grep ENABLED
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: ENABLED
stepfahn@lubu16:~$
funktioniert dies wie gewünscht. Wenn ich jedoch aufrufe stepfahn@lubu16:~$ for i in sda4 sda7 ; do dump $i |grep ENABLED ; done
Gerät »sda4« existiert nicht oder Zugriff verweigert.
Gerät »sda7« existiert nicht oder Zugriff verweigert. erhalte ich einen Fehler. Dabei wird nur der Alias "sda4" nicht richtig ausgewertet, denn ein stepfahn@lubu16:~$ for i in /dev/sda4 /dev/sda7 ; do dump $i |grep ENABLED ; done
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: ENABLED
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 7: ENABLED
stepfahn@lubu16:~$ zeigt das gewünschte Ergebnis. Wie bringe ich die Shell dazu beide aliase, "dump" und "sda4", auszuwerten?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
lionlizard schrieb:
Das ist nicht sinnvoll, weil /dev/sda4 kein ausführbarer Befehl ist.
Auch nicht sinnvoll, weil der Befehl cryptsetup heißt.
Dabei wird nur der Alias "sda4" nicht richtig ausgewertet, denn ein stepfahn@lubu16:~$ for i in /dev/sda4 /dev/sda7 ; do dump $i |grep ENABLED ; done
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: ENABLED
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 7: ENABLED
stepfahn@lubu16:~$ zeigt das gewünschte Ergebnis.
Da bist Du im Irrtum.
Wie bringe ich die Shell dazu beide aliase, "dump" und "sda4", auszuwerten?
Die Shell expandiert Aliase richtig, nämlich so, wie es definiert ist. Variablen würden besser funktionieren. Aber für solche kurzen Namen ist das eigentlich total überflüssig, denn Du kannst ja in der bash und zsh auch folgendes tun: | for i in /dev/sda{4,7}; do dump $i; done | fgrep ENABLED
|
(Zusätzlich habe ich die Pipe ans Ende gesetzt, was effizienter ist.) Alternativ, also, wenn Du noch weniger tippen möchtest: Shell-Funktionen funktionieren auch auf der Kommandozeile: | dump(){ sudo cryptsetup luksDump /dev/sda$1; }
dump 4
dump 7
|
Ich würde das allerdings nicht machen, weil man dann bei den Gerätenamen zu sehr eingeschränkt ist. Weitere Alternative: die Schleife in die Funktion packen.
|
lionlizard
(Themenstarter)
Anmeldungsdatum: 20. September 2012
Beiträge: 6244
Wohnort: Berlin
|
rklm schrieb: Das ist nicht sinnvoll, weil /dev/sda4 kein ausführbarer Befehl ist.
Es sei Dir zugestanden, zu glauben der Befehl alias sei für Befehlsaufrufe vorgesehen, weil das so im Wiki steht. Eine andere Verwendung als "nicht sinnvoll" sprich sinnlos zu bezeichnen, finde ich ziemlich starken Tobak.
Auch nicht sinnvoll, weil der Befehl cryptsetup heißt.
Auch hier ist der Ausdruck "nicht sinnvoll" keineswegs angebracht, denn an meinen Terminalausgaben kann man erkennen, dass hier offenbar ein Tippfehler vorliegt. Sonst wäre der Aufruf des Alias dump mit einer Fehlermeldung quittiert worden,
Dabei wird nur der Alias "sda4" nicht richtig ausgewertet, denn ein stepfahn@lubu16:~$ for i in /dev/sda4 /dev/sda7 ; do dump $i |grep ENABLED ; done
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: ENABLED
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 7: ENABLED
stepfahn@lubu16:~$ zeigt das gewünschte Ergebnis.
Da bist Du im Irrtum.
In wiefern glaubst Du mich im Irrtum? Weißt Du besser, welches Ergebnis gewünscht war? Bemerkenswert. Wie bringe ich die Shell dazu beide aliase, "dump" und "sda4", auszuwerten?
Die Shell expandiert Aliase richtig, nämlich so, wie es definiert ist.
Dort steht:
The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded is not expanded a second time. This means that one may alias ls to "ls -F", for instance, and Bash does not try to recursively expand the replacement text. If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.
Das erste Wort des zu ersetzenden Tetxs wird auf einen Alias getestet, aber ein Wort, das identisch mit einem erweiterten Alias ist, wird kein zweites Mal erweitert. Das bedeutet, dass man beispielsweise einen Alias ls zu "ls -F" erweitern kann, die Bash dann aber nicht versuchen wird, den Ersatztext rekursiv zu erweitern. Wenn das letzte Zeichen des Aliaswertes ein Leerzeichen ist, dann wird das folgende Befehlswort ebenfalls auf das Vorhandensein eines Alias getestet.
Dies deckt sich mit meinen Beobachtungen: dump sda4 wird korrekt zu sudo crypsetup luksDump /dev/sda4 erweitert, solange keine Schleife benutzt wird. Im Übrigen steht im von Dir zitierten Bash Reference Manual auch:
Aliases allow a string to be substituted for a word … The replacement text may contain any valid shell input, including shell metacharacters. Aliase erlauben das Ersetzen eines Wortes durch eine Zeichenkette … Der Ersatztext darf jede gültige Shelleingabe enthalten, einschließlich Shell-Metazeichen.
Hier ist also mit keinem Wort angedeutet, dass man als Ersetzungstext nur Befehle benutzen sollte. rklm schrieb: Variablen würden besser funktionieren. Aber für solche kurzen Namen ist das eigentlich total überflüssig, denn Du kannst ja in der bash und zsh auch folgendes tun: | for i in /dev/sda{4,7}; do dump $i; done | fgrep ENABLED
|
Ein interessanter Hinweis, dass mit den geschweiften Klammern der Ausdruck /dev/sda{4,7} zu erweitern ist. Allerdings geht das an meiner Frage völlig vorbei, wie der Aufruf von 2 Aliasen nacheinander in der If-Schleife zu bewerkstelligen ist.
(Zusätzlich habe ich die Pipe ans Ende gesetzt, was effizienter ist.)
Ob das tatsächlich effizienter ist, sei mal dahingestellt.
Alternativ, also, wenn Du noch weniger tippen möchtest …
Nein, ich dachte, meine Frage: Wie bringe ich die Shell dazu beide aliase, "dump" und "sda4", auszuwerten?
wäre ziemlich eindeutig. Jedenfalls bin ich derzeit nicht daran interessiert, etwas über Funktionen und deren Aufruf in der Shell zu lernen. Aber vielleicht hat ja jemand Muße und Kenntnis, mir zu erklären, wie mein Plan zu verwirklichen wäre oder warum das nicht funktionieren kann.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Wenn Du alles besser weißt, warum fragst Du dann noch ? Sicher ist, dass Du oben einen alias sda4='/dev/sda4' für einen Parameter benutzen wolltest, was aber (definitionsgemäß) nicht geht. Denn ein alias kann immer nur einen Befehl ersetzen, aber niemals einen Parameter ( / Option). (Dessen kannst Du Dich vergewissern, indem Du Dir mit set -x die tatsächlich ausgeführten Befehle anzeigen lässt.) Auch das Zusammenfügen von Optionen geht bei einem alias nicht. (→ guck es Dir an, mit set -x !) Eine mögliche Alternative, mit einer Shell-Funktion, hat Dir Robert gezeigt. Und dass Dein alias bei Dir in der Schleife nicht funktioniert, dürfte nicht an der Schleife an sich liegen, sondern an der Pipe: denn jede Pipe macht eine Untershell auf, und dort gilt der alias nicht unbedingt. Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt
Es lohnt sich also durchaus, den Abschnitt im Bash-Manual genau zu lesen. Das würde nämlich auch Deine Frage beantworten: Wie bringe ich die Shell dazu beide aliase, "dump" und "sda4", auszuwerten?
Gar nicht. Ist per Definition nicht vorgesehen. LG, track
|
lionlizard
(Themenstarter)
Anmeldungsdatum: 20. September 2012
Beiträge: 6244
Wohnort: Berlin
|
track schrieb: Wenn Du alles besser weißt, warum fragst Du dann noch ?
Entschuldige bitte, aber ich glaube gar nicht, etwas besser zu wissen, aber wenn ich wie beschrieben dump und sda4 mit Aliasen belege, und diese dann in der Form Befehl Parameter aufrufe, dann funktioniert das, wie die Ausgabe im Terminal nach Einschalten von set -x zu sehen ist: stepfahn@lubu16:~$ alias dump
+ alias dump
alias dump='sudo cryptsetup luksDump '
stepfahn@lubu16:~$ alias sda4
+ alias sda4
alias sda4='/dev/sda4 '
stepfahn@lubu16:~$ dump sda4 |grep 'ENABLED\|UUID'
+ grep --color=auto 'ENABLED\|UUID'
+ sudo cryptsetup luksDump /dev/sda4
UUID: da400000-1234-5678-9abc-123456789abc
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: ENABLED
Key Slot 6: ENABLED
stepfahn@lubu16:~$
Das lese ich zumindest aus der Ausgabe. Aber wenn ich da etwas falsch interpretiere/verstehe, dann korrigiere mich gern.
Sicher ist, dass Du oben einen alias sda4='/dev/sda4' für einen Parameter benutzen wolltest, was aber (definitionsgemäß) nicht geht. Denn ein alias kann immer nur einen Befehl ersetzen, aber niemals einen Parameter ( / Option). (Dessen kannst Du Dich vergewissern, indem Du Dir mit set -x die tatsächlich ausgeführten Befehle anzeigen lässt.)
Das habe ich tatsächlich nicht gefunden, wo das definiert ist. Könntest Du mir die entsprechende Stelle zitieren, bitte? Denn wie gesagt, bisher zeigen meine empirischen Versuche mir auch etwas Anderes.
Auch das Zusammenfügen von Optionen geht bei einem alias nicht. (→ guck es Dir an, mit set -x !)
Und dass Dein alias bei Dir in der Schleife nicht funktioniert, dürfte nicht an der Schleife an sich liegen, sondern an der Pipe: denn jede Pipe macht eine Untershell auf, und dort gilt der alias nicht unbedingt.
Das denke ich nicht, denn die Pipe benutze ich nur um diverse Zeilen auszublenden, die mich - für meinen Zweck - nur verwirren. Aber ich habe das Beispiel jetzt auch noch einmal ohne Pipe gemacht stepfahn@lubu16:~$ dump sda4
+ sudo cryptsetup luksDump /dev/sda4
LUKS header information for /dev/sda4
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha512
Payload offset: 4096
MK bits: 512
MK digest: be 3a 6f 1c 42 0b 0f 01 d0 3e 2e e8 ee 2e 42 f2 3c 8c 9d b4
MK salt: 0c 57 86 bc db ef a7 6d 76 de 91 19 54 90 46 3b
9c aa 5b 03 7c 70 07 70 de ad d4 7a 55 c4 e3 62
MK iterations: 12625
UUID: da400000-1234-5678-9abc-123456789abc
Key Slot 0: ENABLED
Iterations: 50000
Salt: 64 e7 ad 80 57 a8 02 5b 24 dd 11 2d 7f eb 01 5f
0d 85 01 d9 4e 46 6a e3 a0 68 96 9b 9c c4 78 57
Key material offset: 8
AF stripes: 4000
Key Slot 1: ENABLED
Iterations: 50314
Salt: 46 77 23 19 86 c5 19 41 09 f4 bc a7 b6 ac fe 24
22 d4 60 63 cc e5 08 f3 7f 11 ce e8 b2 b0 80 7a
Key material offset: 512
AF stripes: 4000
Key Slot 2: ENABLED
Iterations: 49688
Salt: 14 1f c8 63 90 38 76 31 b3 71 74 3a 34 fa e2 d4
81 73 71 2a 6a ed 38 e8 35 ef a5 26 70 35 8d 67
Key material offset: 1016
AF stripes: 4000
Key Slot 3: ENABLED
Iterations: 50632
Salt: eb 43 91 4f 3c e5 df 23 bc ab ce 25 01 e1 e0 f4
1e 9b 6a 77 05 2b ca 16 d0 d9 5e 39 54 e2 df 8f
Key material offset: 1520
AF stripes: 4000
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: ENABLED
Iterations: 405062
Salt: fd c6 b4 e5 fe 0c 3d bf 71 6a d1 5d 45 7c 50 17
b6 10 07 99 9f 50 ee d8 c4 a8 df ed 1f 71 69 92
Key material offset: 3032
AF stripes: 4000
Key Slot 7: DISABLED
stepfahn@lubu16:~$ for i in sda4 sda7 ; do dump $i ; done
+ for i in sda4 sda7
+ sudo cryptsetup luksDump sda4
Gerät »sda4« existiert nicht oder Zugriff verweigert.
+ for i in sda4 sda7
+ sudo cryptsetup luksDump sda7
Gerät »sda7« existiert nicht oder Zugriff verweigert.
stepfahn@lubu16:~$
Und hier ist dank set -x sehr gut zu sehen, dass beide Aliase aneiander gereiht wunderbar erweitert werden, wenn ich aber die for-Schleife benutze, dann wird sda4 eben plötzlich nicht mehr erweitert zu /dev/sda4 wie dies noch einen Befehl vorher gemacht wurde, sondern die Befehlszeile lautet nun sudo cryptsetup luksDump sda4 was natürlich mit einer Fehlermeldung quittiert wird. Also ich weiß wirklich nichts besser, aber eure Erklärung kann ich nicht mit dem Verhalten in meiner Shell in Einklang bringen. Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt
Es lohnt sich also durchaus, den Abschnitt im Bash-Manual genau zu lesen.
Ähm, ich gebe zu, dass ich das überlesen habe, aber ohne dass ich jetzt etwas gemacht hätte, war die Option bei mir enabled: stepfahn@lubu16:~$ shopt
+ shopt
autocd off
cdable_vars off
cdspell off
checkhash off
checkjobs off
checkwinsize on
cmdhist on
compat31 off
compat32 off
compat40 off
compat41 off
compat42 off
complete_fullquote on
direxpand off
dirspell off
dotglob off
execfail off
expand_aliases on
extdebug off
extglob on
extquote on
failglob off
force_fignore on
globstar off
globasciiranges off
gnu_errfmt off
histappend on
histreedit off
histverify off
hostcomplete off
huponexit off
interactive_comments on
lastpipe off
lithist off
login_shell off
mailwarn off
no_empty_cmd_completion off
nocaseglob off
nocasematch off
nullglob off
progcomp on
promptvars on
restricted_shell off
shift_verbose off
sourcepath on
xpg_echo off
stepfahn@lubu16:~$
Gar nicht. Ist per Definition nicht vorgesehen.
Wo liest Du das heraus? Weil es in den speziellen Eigenschaften die die Bash hervorheben (features unique to Bash), nicht aufgeführt ist? Aber wie gesagt, wenn es nicht geht, finde ich das gar nicht schlimm, ich würde nur gern wissen, wieso nicht, da es im Prinzip ja funktioniert.
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 8616
Wohnort: Münster
|
Hallo lionlizard! Die manpage der bash sagt: " ALIASES
Aliases allow a string to be substituted for a word when it is used as the first word of a simple command. "
Demnach wird ein ALIAS nicht immer aufgelöst, sondern nur in bestimmten Kontexten. Du verwendest Dein ALIAS sda im Befehl
for i in sda4 sda7 ; do dump $i |grep ENABLED ; done
nicht als erstes Wort (und for … do … done gilt wohl auch nicht als simple command), Dein ALIAS dump im Befehl dump $i |grep ENABLED aber schon. Nach der manpage soll also dump aufgelöst werden, sda aber nicht – das entspricht Deiner Beobachtung.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
lionlizard schrieb: ... Aber ich habe das Beispiel jetzt auch noch einmal ohne Pipe gemacht stepfahn@lubu16:~$ dump sda4
+ sudo cryptsetup luksDump /dev/sda4
.... usw.
Und hier ist dank set -x sehr gut zu sehen, dass beide Aliase aneiander gereiht wunderbar erweitert werden, wenn ich aber die for-Schleife benutze, dann wird sda4 eben plötzlich nicht mehr erweitert ...
Da hast Du Recht ! Und wenn ich mir nochmal den Abschnitt im Bash-Manual genau angucke, finde ich auch die Erklärung dafür:
Grundsätzlich ist es schon richtig, dass ein alias eigentlich immer nur einen Befehl ersetzen kann (→ Kap. 6): Aliases: Substituting one command for another. In sofern ist alles was hier bisher gesagt wurde, schon korrekt. ABER : Hier gibt es bei der Bash (wie an div. anderen Stellen auch) mal wieder so einen kleinen, fiesen Trick mit dem Leerzeichen, der das ganze Prinzip durcheinander bringt. Dazu im Bash-Manual (unter "Aliase"): ... If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.
Und genau das ist es, was Du hier benutzt hast: lionlizard schrieb: Ich habe aliase gesetzt für: alias sda4='/dev/sda4' # usw.
alias dump='sudo crypsetup luksDump '
und da ist es, das Leerzeichen, welches ! Deshalb, und nur deshalb wird bei Dir das 2. Wort nach dem dump durch den alias ersetzt: Wenn, und nur wenn das 1. Wort ein alias mit einem Leerzeichen am Ende ist. Man sieht es schön, wenn man mal ein ganz einfaches Beispiel baut: track@track:~$ alias ee=echo
track@track:~$ alias ee_="echo " # mit Leerzeichen dahinter
track@track:~$ alias tt="./-test/o*"
track@track:~$ alias tt_="./-test/o* " # mit Leerzeichen dahinter
track@track:~$ set -x
track@track:~$ echo tt # nix passiert
+ echo tt
tt
track@track:~$ ee tt
+ echo tt
tt
track@track:~$ ee_ tt # mit Leerzeichen: expandiert auch das 2. Wort
+ echo './-test/or'\''d"ner' './-test/ord ner'
./-test/or'd"ner ./-test/ord ner
track@track:~$ ee_ tt tt # 2. "tt" bleibt unexpandiert: -> beim 1. "tt" ist kein Leerzeichen dahinter
+ echo './-test/or'\''d"ner' './-test/ord ner' tt
./-test/or'd"ner ./-test/ord ner tt
track@track:~$ ee_ tt_ tt
+ echo './-test/or'\''d"ner' './-test/ord ner' './-test/or'\''d"ner' './-test/ord ner'
./-test/or'd"ner ./-test/ord ner ./-test/or'd"ner ./-test/ord ner Man sieht, dass dabei sogar die Filename Expansion funktioniert. Offensichtlich werden die alias also noch vor allen Shell Expansions aufgelöst. (sogar die Brace Expansion funktioniert, ich habe es probiert !) → Du könntest also dein ursprüngliches Vorhaben dadurch erreichen, dass Du ein weiteres alias definierst: alias for_i="for i in " # mit dem Leerzeichen am Ende ! Dann klappt es auch wieder mit dem expandieren: LG, track
|
lionlizard
(Themenstarter)
Anmeldungsdatum: 20. September 2012
Beiträge: 6244
Wohnort: Berlin
|
Was mich dabei irritiert hat, im Ausdruck: for i in /dev/sda4 /dev/sda7 ; do dump $i ,done
wird der alias "dump" ja richtig zu "sudo cryptsetup luksDump " expandiert, aber das nachfolgende "sda4" eben nicht. Aber Deine Anregung mit dem Alias für "for i in " hat tatsächlich funktioniert: stepfahn@lubu16:~$ alias fy sda4 sda7 sda8 sda9 dump
alias fy='for i in '
alias sda4='/dev/sda4 '
alias sda7='/dev/sda7 '
alias sda8='/dev/sda8 '
alias sda9='/dev/sda9 '
alias dump='sudo cryptsetup luksDump '
stepfahn@lubu16:~$ fy sda4 sda7 sda8 sda9 ; do dump $i |grep 'sda\|ENABLED' ; done
LUKS header information for /dev/sda4
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: ENABLED
Key Slot 6: ENABLED
LUKS header information for /dev/sda7
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 6: ENABLED
Key Slot 7: ENABLED
LUKS header information for /dev/sda8
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 6: ENABLED
Key Slot 7: ENABLED
LUKS header information for /dev/sda9
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 6: ENABLED
Key Slot 7: ENABLED
stepfahn@lubu16:~$
Und nun kann ich mir auch erklären, warum es nur so funktionieren kann. Es wird nur beim ersten Wort eines Befehls auf einen Alias geprüft. Wenn erst das zweite oder dritte Wort ein Alias ist, dann wird diese Prüfung nicht mehr angestellt. Hierbei ist die Schleife der erste Befehl, und sda4 ff. sind das 4. und folgende Worte, und werden daher nicht auf Alias geprüft. "do dump $i " ist zwar der zweite Befehl, weshalb "dump" erweitert wird, aber "sda4" usw. wurden bereits einmal geprüft (sie werden ja vom 1: Befehl durchgereicht) und werden daher nicht ein weiteres mal geprüft und entsprechend nicht erweitert. Dies entspricht dem Mechanismus, nach dem Aliase nicht rekursiv erweitert werden. Wenn nun die Schleife mit einem Alias beginnt, werden die Parameter "sda4,sda7 …" bereits in der Schleife erweitert und in der erweiterten Form an den Befehl in der Schleife durchgereicht. Mysterium geklärt. Vielen Dank für Deine Denkanstöße. BTW: das Leerzeichen am Ende des Alias war absichtlich eingefügt,auch "/dev/sda4 " "/dev/sda7 " usw. enthielten jeweils ein Leerzeichen am Ende, weil ich das in irgendeinem Howto zu Aliasen so gelesen habe.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
lionlizard schrieb: rklm schrieb:
Dabei wird nur der Alias "sda4" nicht richtig ausgewertet, denn ein stepfahn@lubu16:~$ for i in /dev/sda4 /dev/sda7 ; do dump $i |grep ENABLED ; done
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: ENABLED
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 7: ENABLED
stepfahn@lubu16:~$ zeigt das gewünschte Ergebnis.
Da bist Du im Irrtum.
In wiefern glaubst Du mich im Irrtum? Weißt Du besser, welches Ergebnis gewünscht war? Bemerkenswert.
Nein, Du warst im Irrtum, weil Du schreibst, dass es "nicht richtig ausgewertet" wird: Es wird richtig ausgewertet. (Und ja, ich kann mir denken, wie es gemeint war, würde mir aber nicht anmaßen, das besser als Du selbst zu wissen.)
Dies deckt sich mit meinen Beobachtungen: dump sda4 wird korrekt zu sudo crypsetup luksDump /dev/sda4 erweitert, solange keine Schleife benutzt wird.
Das Problem ist aber nicht die Schleife, sondern, dass Du die Expansion auf zwei Befehle verteilst. Auch in einer Schleife funktioniert das mit der Expansion im zweiten usw. Wort wunderbar: | $ alias oskar='huibu'
$ alias foo='echo bar '
$ for i in 1 2 3; do foo oskar; done
bar huibu
bar huibu
bar huibu
$ alias foo='echo bar'
$ for i in 1 2 3; do foo oskar; done
bar oskar
bar oskar
bar oskar
|
Es liegt nur am Leerzeichen am Ende. (Das war mir nicht bekannt. Danke für den Lerneffekt!)
Im Übrigen steht im von Dir zitierten Bash Reference Manual auch:
Aliases allow a string to be substituted for a word … The replacement text may contain any valid shell input, including shell metacharacters. Aliase erlauben das Ersetzen eines Wortes durch eine Zeichenkette … Der Ersatztext darf jede gültige Shelleingabe enthalten, einschließlich Shell-Metazeichen.
Hier ist also mit keinem Wort angedeutet, dass man als Ersetzungstext nur Befehle benutzen sollte.
Stimmt. Ich habe z.B. den sehr praktischen | alias noerr='2>/dev/null'
|
Den sollte ich dann mal mit einem Leerzeichen am Ende ausstatten. ☺
(Zusätzlich habe ich die Pipe ans Ende gesetzt, was effizienter ist.)
Ob das tatsächlich effizienter ist, sei mal dahingestellt.
Ja natürlich, weil ein Prozess weniger erzeugt wird. Merken wirst Du das vermutlich nicht. lionlizard schrieb:
Aber Deine Anregung mit dem Alias für "for i in " hat tatsächlich funktioniert: stepfahn@lubu16:~$ alias fy sda4 sda7 sda8 sda9 dump
alias fy='for i in '
alias sda4='/dev/sda4 '
alias sda7='/dev/sda7 '
alias sda8='/dev/sda8 '
alias sda9='/dev/sda9 '
alias dump='sudo cryptsetup luksDump '
stepfahn@lubu16:~$ fy sda4 sda7 sda8 sda9 ; do dump $i |grep 'sda\|ENABLED' ; done
Mir erschließt sich allerdings nicht, warum man das so machen sollte. Es gibt andere Möglichkeiten, sich einem das Tippen zu ersparen (siehe mein letztes Posting), die auch noch kürzer sind. Eine Schwäche dieses Ansatzes ist m.E. auch, dass die Variable i in einem Alias definiert wird und Du sie dann aber explizit nutzt. Man muss also wissen, dass sie im Alias steckt. Übrigens kann man auch bei der direkten Eingabe Tipparbeit sparen: | for i in 4 7; do dump /dev/sda$i; done
|
Das hätte ich noch erwähnen sollen.
Und nun kann ich mir auch erklären, warum es nur so funktionieren kann. Es wird nur beim ersten Wort eines Befehls auf einen Alias geprüft. Wenn erst das zweite oder dritte Wort ein Alias ist, dann wird diese Prüfung nicht mehr angestellt.
Genau. Außer der erste Alias endet mit einem Leerzeichen.
Hierbei ist die Schleife der erste Befehl, und sda4 ff. sind das 4. und folgende Worte, und werden daher nicht auf Alias geprüft. "do dump $i " ist zwar der zweite Befehl,
dump ist das erste Wort eines einfachen Kommandos ("simple command"). Deshalb wird es als Alias expandiert.
weshalb "dump" erweitert wird, aber "sda4" usw. wurden bereits einmal geprüft (sie werden ja vom 1: Befehl durchgereicht) und werden daher nicht ein weiteres mal geprüft und entsprechend nicht erweitert.
Sie sind aber beim "Durchreichen" keine Aliase, sondern Werte, die die Variable i annimmt. Deshalb gibt es da auch keine Aliase zu expandieren.
Dies entspricht dem Mechanismus, nach dem Aliase nicht rekursiv erweitert werden.
Rekursive Erweiterung ist das aber nicht. Das bezieht sich auf einen Alias der selbst einen Alias aufruft: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | $ alias oha=foo
$ oha
No command 'foo' found, did you mean:
Command 'fog' from package 'ruby-fog' (universe)
Command 'woo' from package 'python-woo' (universe)
Command 'fop' from package 'fop' (universe)
Command 'fio' from package 'fio' (universe)
Command 'zoo' from package 'zoo' (universe)
Command 'fox' from package 'objcryst-fox' (universe)
Command 'goo' from package 'goo' (universe)
Command 'fgo' from package 'fgo' (universe)
foo: command not found
$ alias foo='echo bar'
$ foo
bar
$ oha
bar
|
Hier wird oha rekursiv expandiert. Das passiert nur dann nicht, wenn ein Alias seinen eigenen Namen enthält, wie Du ja referiert hast.
Wenn nun die Schleife mit einem Alias beginnt, werden die Parameter "sda4,sda7 …" bereits in der Schleife erweitert und in der erweiterten Form an den Befehl in der Schleife durchgereicht.
Und zwar als Werte der Variablen i.
Mysterium geklärt. Vielen Dank für Deine Denkanstöße. BTW: das Leerzeichen am Ende des Alias war absichtlich eingefügt,auch "/dev/sda4 " "/dev/sda7 " usw. enthielten jeweils ein Leerzeichen am Ende, weil ich das in irgendeinem Howto zu Aliasen so gelesen habe.
Hast Du da eine Quellenangabe? Das ist wirklich nur relevant für den Trick, den track beschrieben hat. Sonst macht man das normalerweise nicht.
|
lionlizard
(Themenstarter)
Anmeldungsdatum: 20. September 2012
Beiträge: 6244
Wohnort: Berlin
|
rklm schrieb: Nein, Du warst im Irrtum, weil Du schreibst, dass es "nicht richtig ausgewertet" wird: …
Ich verstehe. Dann warst Du also nur zu borniert, eine verständliche ausführliche Antwort zu geben, und hast jetzt nicht nur gewartet, bis ich auf die Lösung komme, um sie mir dann zu erklären. Dann ist das ja geklärt. [Edit](hatte ich überlesen) rklm schrieb: lionlizard schrieb: … BTW: das Leerzeichen am Ende des Alias war absichtlich eingefügt,auch "/dev/sda4 " "/dev/sda7 " usw. enthielten jeweils ein Leerzeichen am Ende, weil ich das in irgendeinem Howto zu Aliasen so gelesen habe.
Hast Du da eine Quellenangabe?
Vermutlich hier.
|