使用Shell和Gemini构建知识库应用:完整实战指南

云信安装大师
90
AI 质量分
4 5 月, 2025
4 分钟阅读
0 阅读

使用Shell和Gemini构建知识库应用:完整实战指南

引言

在信息爆炸的时代,如何高效管理和检索个人知识成为一大挑战。本文将带你使用Shell脚本和轻量级文本数据库Gemini,构建一个命令行下的个人知识库应用。这个方案特别适合开发者、技术写作者和任何需要整理大量笔记的用户。

准备工作

环境要求

  • Linux/macOS系统(Windows用户可使用WSL)
  • Bash 4.0+
  • Gemini数据库(我们将使用其CLI版本)

安装Gemini

代码片段
# 在Ubuntu/Debian上安装
sudo apt-get update
sudo apt-get install gemini-bin

# 在macOS上使用Homebrew安装
brew install gemini

验证安装

代码片段
gemini --version
# 应输出类似:gemini 1.2.0

项目结构设计

我们先创建项目目录结构:

代码片段
mkdir -p ~/knowledge_base/{data,scripts,backups}
cd ~/knowledge_base

目录说明:
data/: 存放Gemini数据库文件
scripts/: 存放我们的Shell脚本
backups/: 自动备份目录

核心脚本实现

1. 初始化知识库

创建初始化脚本 scripts/init_kb.sh

代码片段
#!/bin/bash

# 定义知识库路径
KB_PATH="$HOME/knowledge_base/data/my_knowledge.gmi"

# 初始化Gemini数据库
if [ ! -f "$KB_PATH" ]; then
    echo "Initializing new knowledge base..."
    gemini init "$KB_PATH"

    # 创建基本表结构
    gemini "$KB_PATH" <<EOF
CREATE TABLE IF NOT EXISTS knowledge (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    content TEXT NOT NULL,
    tags TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
EOF

    echo "Knowledge base created at $KB_PATH"
else
    echo "Knowledge base already exists at $KB_PATH"
fi

给脚本执行权限:

代码片段
chmod +x scripts/init_kb.sh

运行初始化:

代码片段
./scripts/init_kb.sh

2. 添加知识条目

创建添加脚本 scripts/add_entry.sh

代码片段
#!/bin/bash

# 加载知识库路径配置
source "$HOME/knowledge_base/scripts/config"

if [ $# -lt 2 ]; then
    echo "Usage: $0 \"Title\" \"Content\" [tags]"
    exit 1
fi

title="$1"
content="$2"
tags="${3:-general}"

# SQL插入语句,使用参数化查询防止注入
gemini "$KB_PATH" <<EOF 
INSERT INTO knowledge (title, content, tags) 
VALUES ("$title", "$content", "$tags");
EOF

echo "New entry added successfully!"

创建配置文件 scripts/config

代码片段
#!/bin/bash

# Knowledge base configuration file

export KB_PATH="$HOME/knowledge_base/data/my_knowledge.gmi"

使用方法:

代码片段
./scripts/add_entry.sh "Linux常用命令" "ls -l:列出详细信息\ngrep:文本搜索" "linux,command"

3. 搜索知识库

创建搜索脚本 scripts/search_kb.sh

代码片段
#!/bin/bash

source "$HOME/knowledge_base/scripts/config"

if [ $# -eq 0 ]; then 
    echo "Usage: $0 search_term [tag_filter]"
    exit 1 
fi

search_term="$1"
tag_filter="${2:-%}" # %是SQL通配符,表示匹配任意标签

echo "Searching for: $search_term"
if [ "$tag_filter" != "%" ]; then 
    echo "Filtering by tag: $tag_filter"
fi 

gemini "$KB_PATH" <<EOF 
.mode column 
.headers on 
SELECT id, title, substr(content,1,50) AS preview, tags 
FROM knowledge 
WHERE (title LIKE '%$search_term%' OR content LIKE '%$search_term%') 
AND tags LIKE '%$tag_filter%'
ORDER BY updated_at DESC;
EOF 

示例搜索:

代码片段
./scripts/search_kb.sh "grep" "linux"

4. 备份与恢复

创建备份脚本 scripts/backup_kb.sh

代码片段
#!/bin/bash 

source "$HOME/knowledge_base/scripts/config"

BACKUP_DIR="$HOME/knowledge_base/backups"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/kb_backup_$TIMESTAMP.gmi"

# Create backup directory if not exists 
mkdir -p "$BACKUP_DIR"

echo "Backing up knowledge base to $BACKUP_FILE..."
cp "$KB_PATH" "$BACKUP_FILE"

# Keep only last 7 backups (可选)
find "$BACKUP_DIR" -name "kb_backup_*.gmi" | sort | head -n -7 | xargs rm -f --

echo "Backup completed."

恢复脚本 scripts/restore_kb.sh

代码片段
#!/bin/bash 

source "$HOME/knowledge_base/scripts/config"

BACKUP_DIR="$HOME/knowledge_base/backups"

echo "Available backups:"
ls -lt "$BACKUP_DIR"/kb_backup_*.gmi | nl 

read -p "Enter backup number to restore: " num 

backup_file=$(ls -t "$BACKUP_DIR"/kb_backup_*.gmi | sed -n "${num}p")

if [ ! -f "$backup_file" ]; then 
    echo "Invalid selection!"
    exit 1 
fi 

read -p "Are you sure you want to restore from $backup_file? (y/n) " confirm 

if [ "$confirm" = "y" ]; then 
    cp "$backup_file" "$KB_PATH"
    echo "Restore completed."
else 
    echo "Restore cancelled."
fi 

高级功能扩展

Markdown导出功能

添加 scripts/export_md.sh

代码片段
#!/bin/bash 

source "$HOME/knowledge_base/scripts/config"

OUTPUT_DIR="$HOME/knowledge_base/exports"
mkdir -p "$OUTPUT_DIR"

QUERY="SELECT id, title, content FROM knowledge ORDER BY created_at DESC;"

gemini --csv "$KB_PATH" <<< "$QUERY" > temp.csv 

{
echo "# Knowledge Base Export $(date)"
echo ""
while IFS=',' read -r id title content; do 
    # Skip header line and empty lines  
    [[ $id == id ]] && continue  

    echo ""
    echo "# ${title}"
    echo ""

     # Convert SQLite newlines to Markdown newlines  
     content=${content//\\n/$'\n'}  
     content=${content//\\\"/\"}  

     echo "${content}"
done < temp.csv  

} > "${OUTPUT_DIR}/knowledge_export_$(date +%Y%m%d).md"

rm temp.csv  

echo "Markdown export saved to ${OUTPUT_DIR}/knowledge_export_$(date +%Y%m%d).md"

Shell别名简化操作

~/.bashrc (或对应shell配置文件)中添加:

代码片段
alias kb-add="~/knowledge_base/scripts/add_entry.sh"
alias kb-search="~/knowledge_base/scripts/search_kb.sh"
alias kb-backup="~/knowledge_base/scripts/backup_kb.sh"
alias kb-restore="~/knowledge_base/scripts/restore_kb.sh"
alias kb-export="~/knowledge_base/scripts/export_md.sh"

然后执行:

代码片段
source ~/.bashrc  

现在可以直接用短命令操作:

代码片段
kb-add "新标题" "内容描述"  
kb-search git programming  

Cron定时备份设置

设置每天自动备份:

1.打开crontab编辑器:

代码片段
crontab -e  

2.添加以下行(路径根据实际情况调整):

代码片段
015 * * * /home/$USER/knowledge_base/scripts/backup_kb.sh >> /home/$USER/knowledge_base/logs/cron.log2>&1  

3.确保日志目录存在:

代码片段
mkdir ~logs/
touch ~logs/cron.log   
chmod644 ~logs/cron.log   

常见问题解决

Q:执行geminit命令报错:”command not found”?
A:确保正确安装了geminit并位于PATH中。可以尝试:

代码片段
which geminit   
如果找不到,检查安装步骤或手动添加到PATH。    

**Q:**插入内容包含特殊字符导致SQL错误?   
A:修改add_entry.sh中的引号处理:   

content=”${2//\”/\\”}” #转义双引号
title=”${1//\”/\\”}”
tags=”${3//\”/\\”}”

代码片段

**Q:**搜索中文内容不匹配?   
A:Geminit默认使用UTF8编码,确保终端和文件编码一致。可以尝试:   

export LANG=en_US.UTF8    

总结

通过本教程,我们完成了:

1.搭建基于Shell和Geminit的知识库系统
2.实现增删改查等核心功能
3.添加备份、导出等实用特性
4.优化日常使用体验

这个方案的优势在于:

-轻量级,无需复杂环境
-纯文本存储,便于版本控制
-完全命令行操作,适合开发者
-可轻松扩展更多功能

原创 高质量