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

Загадка 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' приведена только в качестве иллюстрации.

решение1

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

Демонстрация:

cat <(echo 'test')

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

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

решение2

На основании ответов выше:

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

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

решение3

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

Связанный контент