Wenn ich es !
beispielsweise als Feldtrennzeichen verwende, awk -F!
wird eine Fehlermeldung ausgegeben bash: !: event not found
. Warum? Es wird akzeptiert awk -F"\!"
. Bash-Version 3.2.25
Antwort1
!
ist das Auslösezeichen für BashsGeschichte Erweiterung. Wenn dies aktiviert ist, !foo
wird etwas wie in einer Befehlszeile auf den letzten Befehl erweitert, der mit beginnt foo
. Oder wenn es keine solche Befehlszeile gibt, gibt die Shell einen Fehler aus, wie hier.
Als letztes Zeichen eines Wortes sollte es jedoch nichts bewirken. Dies funktioniert tatsächlich wie beabsichtigt in allen von mir getesteten Bash-Versionen:
$ echo 'aa!bb' | awk -F! '{print $1}'
aa
In neueren Versionen !
sollte auch vor einem abschließenden Anführungszeichen nichts geschehen, -F"!"
funktioniert also in späteren Versionen, aber nicht in 3.2.
Ein Backslash oder einfache Anführungszeichen können verwendet werden, um es zu umgehen, d. h. weder \!foo
noch '!foo'
würde erweitert. Natürlich können Sie es auch verhindern, indem Sie die Verlaufserweiterung mit vollständig deaktivieren set +H
.
Bei doppelten Anführungszeichen ist es merkwürdiger. Darin deaktiviert ein Backslash die Verlaufserweiterung, der Backslash selbst bleibt jedoch bestehen:
$ printf '%s\n' "\!foo"
\!foo
In diesem Fall awk -F"\!"
funktioniert dies, weil awk selbst den Backslash entfernt.
Antwort2
Das ist nicht awk
der Grund dafür. Es ist die Shell. !
ist ein Sonderzeichen in der Shell.
Was zu tun
Zitieren Sie immer Ihre Argumente. zB
awk -F'!'