Назад | Перейти на главную страницу

Загадка SQLite / STDIN, характерная для AIX

Я играл с SQlite на работе, в частности, пытаясь заставить инструмент командной строки sqlite3 принимать stdin вместо файла. Звучит достаточно просто, в Linux вы можете выполнить такую ​​команду, как:

echo 'test' | sqlite3 test.db '.import /dev/stdin test'

К сожалению, наши рабочие машины работают под управлением AIX (5 и 6), и, насколько я могу судить, нет эквивалента виртуальному файлу / dev / stdin. Мне удалось собрать эквивалентную команду, которая работает в AIX с использованием временного файла.

echo 'test' | cat - > /tmp/blah ; sqlite3 test.db '.import /tmp/blah test' ; rm /tmp/blah

Теперь делает это необходимость использовать STDIN? разве этого временного файла недостаточно? Возможно, но я надеялся, что у кого-то с лучшим unix-fu будет более элегантное решение.

нота: данные, которые я хотел бы импортировать, предоставляются только через STDOUT, поэтому эхо 'тест' команда все о.

Разъяснение - У меня есть контроль только над командами с правой стороны канала, показанного выше. Данные обрабатываются, а затем передаются моей команде через stdin / stdout. команда echo 'test' носит исключительно иллюстративный характер.

Если хаки STDIN не работают на этой платформе, как насчет использования именованного канала вместо временного файла? С точки зрения двух программ он будет вести себя как файл, но без фактической записи на диск и чтения с него.

Основываясь на ответах выше:

... | sqlite3 test.db 'import '<(cat -)' test'

Я тестировал это в своей системе, и, похоже, он делает то, что вы хотите.

Если вы на самом деле используете Bash, а AIX поддерживает подстановку процессов (которая, как мне кажется, зависит от платформы), это может сработать для вас:

Демо:

cat <(echo 'test')

Ваша команда:

sqlite3 test.db '.import '<(echo test)' test'