Кажется, я наткнулся на что-то, что, вероятно, является ошибкой в awk, но это также может быть ошибкой в моем понимании bash/awk.
Я пытался отладить проблемы, когда вывод программы python передавался в awk, и я получал следующее исключение независимо от того, что делала команда awk.
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
Как оказалось, awk получал пустой первый аргумент, а затем -f awkfilename.awk
. Таким образом, ошибка может быть воспроизведена следующей командной строкой:
python -c 'print "hello"' | awk ''
Но если я запускаю awk без каких-либо аргументов (это то, что я считаю выше эквивалентом), я получаю помощь awk, за которой следует то же исключение
python -c 'print "hh"' | awk
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options: GNU long options:
-f progfile --file=progfile
-F fs --field-separator=fs
-v var=val --assign=var=val
-m[fr] val
-W compat --compat
-W copyleft --copyleft
-W copyright --copyright
-W dump-variables[=file] --dump-variables[=file]
-W exec=file --exec=file
-W gen-po --gen-po
-W help --help
-W lint[=fatal] --lint[=fatal]
-W lint-old --lint-old
-W non-decimal-data --non-decimal-data
-W profile[=file] --profile[=file]
-W posix --posix
-W re-interval --re-interval
-W source=program-text --source=program-text
-W traditional --traditional
-W usage --usage
-W use-lc-numeric --use-lc-numeric
-W version --version
To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.
gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.
Examples:
gawk '{ sum += $1 }; END { print sum }' file
gawk -F: '{ print $1 }' /etc/passwd
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
Примечание: сообщение после «Исходное исключение было:» на самом деле пустое, его я не пропустил.
Подробности о моей системе
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
$ awk --version
GNU Awk 3.1.6
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.3 LTS
$ uname -a
Linux <hostname> 2.6.32-37-generic #81-Ubuntu SMP Fri Dec 2 20:32:42 UTC 2011 x86_64 GNU/Linux
Я был бы счастлив, если бы кто-то мог предложить некоторое понимание. Конечно, немедленное решение состоит в том, чтобы очистить аргумент, который передается как пустой для awk, что я и сделал, но это заставило меня задуматься о причине.
Правки
Основываясь на комментариях ниже, я понимаю, что awk
и awk ''
отличаются тем, что второй вызов означает, что awk видит количество аргументов равным 1 (с аргументом, являющимся пустой строкой) вместо 0.
Что я до сих пор не понимаю, так это то, что делает пустая строка в выражении awk.
Например, следующие хорошо работает
$ echo "" > /tmp/empty.awk
$ python -c 'print "hello"' | awk -f /tmp/empty.awk
$ echo $?
$ 0