
我一直在工作中使用 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
現在,是嗎需要使用標準輸入?這個臨時文件還不夠嗎?可能吧,但我希望有更好的 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 hack 在該平台上不起作用,那麼使用命名管道而不是臨時檔案怎麼樣?從兩個程式的角度來看,它的行為就像一個文件,但沒有實際寫入磁碟和從磁碟讀取。