Ich frage mich nur, warum das nicht funktioniert
#!/bin/bash
ls /bin
ls !$
Ich erwarte, ls /bin
zweimal zu laufen , aber der zweite wirft Fehler auf, wie !$
nicht interpretiert wurde
Habe ich etwas verpasst oder !$
nur in der Kommandozeile gearbeitet?
Ich konnte kein relevantes Teil in man bash
(auf dem Mac) finden.
Antworten:
Verlauf und Verlaufserweiterung sind standardmäßig deaktiviert, wenn die Shell nicht interaktiv ausgeführt wird.
Du brauchst:
oder:
Dies wirkt sich auf alle
script.sh
möglicherweise ausgeführten Bash-Instanzen aus.quelle
bash
das läuftscript.sh
, sondern auch alle anderenbash
Instanzen , diescript.sh
schließlich führen kann (wie auch anderebash
Skripte ...).bash
Instanz aus, die Ihr Skript ausführt.Das Vernünftige wäre
oder
oder
Vorsichtsmaßnahmen: Es ist erwähnenswert, dass jede dieser Situationen mit einigen Fallstricken verbunden ist. Die $ _ -Lösung erfasst nur das letzte einzelne Argument: So
ls foo bar
bleibt $ _ mit just übrigbar
. Die eine mitset
werden die Argumente außer Kraft setzen ($1
,$2
usw.). Und all dies wird wie geschrieben funktionieren, aber wenn es auf komplexere Befehle verallgemeinert wird (wo Flucht und Leerzeichen wichtig sind), könnten Sie auf einige Schwierigkeiten stoßen. Beispiel:ls 'foo bar'
(wenn das Argument fürfoo bar
einen einzelnen Pfadnamen zwei oder mehr Leerzeichen oder andere Leerzeichen enthält) wird sich in keinem dieser Beispiele korrekt verhalten. Um diese Fälle zu umgehen, ist möglicherweise eine ordnungsgemäße Flucht (möglicherweise in Kombination mit einemeval
Befehl) oder eine Verwendung"$@"
anstelle von$*
erforderlich.quelle
$_
Weg ist nicht tragbar, Sie haben Recht. Derset
Ansatz funktioniert in nicht-interaktivem Dash und sollte mit dem${1+"$@"}
Trick (plus zsh global alias) allgemein sein, obwohl ich mich vage daran erinnere, dassset
er in der Vergangenheit mit einigen (alten?) Shells nicht perfekt portierbar war. Der Ansatz, eine Variable zu definieren, die den Befehl und dann die Auswertung enthält, insbesondereeval
soweit ein ordnungsgemäßes Escapezeichen und ein tatsächlicher Befehl verwendet werden, ist meines Wissens im Allgemeinen vollständig portierbar.