Was beudeutet !* in der Bash?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
honeywell
Beiträge: 21
Registriert: 06.03.2016 12:52:45

Was beudeutet !* in der Bash?

Beitrag von honeywell » 30.07.2016 13:04:13

Hallo,

ich war auf der Suche nach einer Lösung für das Problem: cd in einer Subshell soll sich auf die aufrufende Shell auswirken.

Auf Stackoverflow habe ich folgendes gefunden:

Code: Alles auswählen

alias proj="cd \`/usr/bin/proj !*\`"
Die Lösung funktioniert, aber selbst nach Suche in der Manpage von bash weiß ich nicht warum.

Kann mir jemand erklären, warum die Zeichenfolge !* zur Auflösung aller Argumente führt? Ich hätte $* oder $@ erwartet.

Benutzeravatar
TRex
Moderator
Beiträge: 8319
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: Was beudeutet !* in der Bash?

Beitrag von TRex » 30.07.2016 13:40:30

Du suchst (wie ich einst) an der falschen Stelle: readline tut das.

https://cnswww.cns.cwru.edu/php/chet/re ... story.html
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
honeywell
Beiträge: 21
Registriert: 06.03.2016 12:52:45

Re: Was beudeutet !* in der Bash?

Beitrag von honeywell » 30.07.2016 14:54:53

Danke für den Link. Aber ich glaube, ganz habe ich es noch nicht begriffen. Deshalb frage ich noch einmal nach.

Ich vermute, von der verlinkten Webseite ist
*
All of the words, except the 0th. This is a synonym for `1-$'. It is not an error to use `*' if there is just one word in the event; the empty string is returned in that case.
entscheidend. Das würde bedeuten, dass !* zu den letzten Argumenten des vorherigen Kommandos expandiert wird. Richtig?

Wird also das Skript proj von Stack overflow über den obigen Alias aufgerufen, wird durch !* der Programmname verworfen. Übrig bleiben alle weiteren Argumente. Die werden dem Skript /usr/bin/proj, dass ja mit absolutem Pfad im Alias steht, übergeben. Ist diese Interpretation richtig?

Es scheint wichtig zu sein, dass das letzte Kommando vor der Definition des Alias keine Argumente hat, sonst werden diese bereits bei der Definition des Alias expandiert und sind somit Bestandteil des Alias.

guennid

Re: Was beudeutet !* in der Bash?

Beitrag von guennid » 30.07.2016 18:29:01

Aber ich glaube, ganz habe ich es noch nicht begriffen.
Das ist nicht zu begreifen. Shell-Syntax is' was für Götter und Kafka (1)! :P

(1) http://gutenberg.spiegel.de/buch/franz-kafka-erz-161/5

*duck und weg*

Benutzeravatar
TRex
Moderator
Beiträge: 8319
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: Was beudeutet !* in der Bash?

Beitrag von TRex » 30.07.2016 20:15:23

Ich muss zugeben, die genaue Funktionsweise von readlink-expansion im alias erschließt sich mir auch nicht.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
honeywell
Beiträge: 21
Registriert: 06.03.2016 12:52:45

Re: Was beudeutet !* in der Bash?

Beitrag von honeywell » 30.07.2016 20:41:31

TRex hat geschrieben:Ich muss zugeben, die genaue Funktionsweise von readlink-expansion im alias erschließt sich mir auch nicht.
Ich habe mal folgendes probiert:

Code: Alles auswählen

echo ls -l
!*
-> ls -l wird ausgeführt.

Das verstehe ich.

Somit nehme ich an, dass auch meine Vermutungen im letzten Post richtig waren.

Von meiner Seite aus kann der Thread geschlossen und als gelöst markiert werden.

Nochmals vielen Dank an TRex!

guennid

Re: Was beudeutet !* in der Bash?

Beitrag von guennid » 01.08.2016 07:40:56

honeywell hat geschrieben:Von meiner Seite aus kann der Thread [...] als gelöst markiert werden.
Das wirst du schon selbst tun müssen: 1. Beitrag editieren und z.B. (gelöst) an den Anfang des Titels setzen.

Grüße, Günther

Antworten