Was zu tun

Was zu tun

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, !foowird 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 \!foonoch '!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 awkder Grund dafür. Es ist die Shell. !ist ein Sonderzeichen in der Shell.

Was zu tun

Zitieren Sie immer Ihre Argumente. zB

awk -F'!'

verwandte Informationen