
Я игрался с 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 не работают на этой платформе, как насчет использования именованного канала вместо временного файла? С точки зрения двух программ это будет вести себя как файл, но без фактической записи на диск и чтения с него.