Загадка 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, так что именно в этом и заключается команда echo 'test'.

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

3 ответа

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

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

Демо-версия:

cat <(echo 'test')

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

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

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

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

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

Другие вопросы по тегам