BNU-FZH

fengzhenhua@outlook.com

在 Markdown 中添加目录(Table of Contents, ToC)并不是直接支持的功能,但是你可以手动创建一个简单的目录,使用链接和锚点来指向文档中的各个部分。首先,在你想链接到的标题或段落前设置一个锚点(ID),然后在目录部分创建指向这些锚点的链接。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 目录
- [简介](#简介)
- [安装](#安装)
- [使用方法](#使用方法)

# 简介
这是介绍内容。

## 安装
这是安装说明。

## 使用方法
这是使用方法。

注意:不是所有的Markdown解析器都支持通过标题自动创建锚点链接。有些解析器可能会需要你显式地为每个标题定义一个唯一的ID,像这样:

1
## <a name="安装"></a>安装

当编写复杂的 Shell 脚本时,了解脚本在何处停止执行可以极大地帮助调试和优化。本文将介绍几种在 Shell 脚本中判断脚本停止位置的方法。

目录

添加日志记录

通过在脚本的关键位置添加日志记录,可以帮助跟踪脚本的执行进度。例如:

1
echo "Script has reached step 1" >> script.log 

这行命令会在每次执行到该行时向 script.log 文件追加一条消息。

启用调试模式

你可以使用 -x 选项来启用 bash 的调试模式,这会让它打印出执行的每个命令:

1
bash -x ./your_script.sh

或者在脚本内部临时开启调试:

1
2
3
set -x
# 你的代码
set +x

这样可以在脚本的特定部分开启或关闭调试输出。

错误捕获和通知

使用 trap 命令可以在发生错误时执行特定的命令,比如发送通知或写入日志:

1
trap 'echo "Error at line $LINENO: $BASH_COMMAND"' ERR

这将在任何命令失败时触发,并打印出错误发生的行号和命令。

检查退出状态

每个命令执行后都会返回一个退出状态码,通常0表示成功,非零值表示错误。可以通过检查 $? 变量来决定是否继续执行:

1
2
3
4
5
command
if [ $? -ne 0 ]; then
echo "Command failed"
exit 1
fi

这种方式确保只有当上一条命令成功时才会继续执行。

在 Shell 脚本中避免输入 sudo 密码的方法有几种,但每种方法都有其适用场景和安全考量。以下是几种常见的方法:

1. 修改 /etc/sudoers 文件

你可以编辑 /etc/sudoers 文件(推荐使用 visudo 命令以确保语法正确),为特定用户或用户组添加不需要密码的权限。

例如,要允许用户 username 在不输入密码的情况下运行所有命令,可以添加如下行:

1
username ALL=(ALL) NOPASSWD:ALL 

如果你想限制到特定命令,比如只允许不输入密码地运行 apt-get update,可以这样做:

1
username ALL=(ALL) NOPASSWD:/usr/bin/apt-get update

2. 使用sudo -S和环境变量

虽然这不是最推荐的安全实践,但在某些情况下你可能需要自动化流程,并且能够通过环境变量传递密码。你可以设置一个环境变量来保存密码,并结合 echosudo -S 来实现这一点。但是,请注意这种方法存在安全风险,因为密码可能会被其他进程看到。

1
2
export SUDO_PASSWORD="your_password_here"
echo "$SUDO_PASSWORD" | sudo -S command_to_run

警告: 这种方式并不安全,应该尽量避免使用。

3. 使用sudo-n选项

-n 选项可以让 sudo 尝试非交互式执行命令,即如果当前用户没有足够的权限或缓存的凭证已过期,则不会提示输入密码而是直接失败。这可以用于检查是否可以在不提供密码的情况下执行命令。

1
sudo -n command_to_run

4. 利用sudo的时间戳

sudo 会缓存用户的认证一段时间(默认是15分钟)。如果你在一个脚本中多次调用 sudo,那么在第一次成功输入密码后,在这段时间内后续的 sudo 调用将不再要求密码。

安全建议

无论选择哪种方法,都应该谨慎行事,确保最小权限原则 ( Principle of Least Privilege ) 得以遵守,即给予用户完成工作所需的最少权限。修改系统配置文件如 /etc/sudoers 应该非常小心,错误的配置可能导致安全漏洞或系统无法正常工作。

GitHub CLI 简介

GitHub CLI 是一个用于通过命令行与 GitHub 进行交互的强大工具。它允许开发者和用户管理存储库、拉取请求、问题和其他 GitHub 资源,而无需离开终端。

主要功能

  1. 仓库管理:创建、克隆、列出和删除仓库。
  2. 拉取请求:查看、创建、合并和关闭拉取请求。
  3. 问题跟踪:创建、列表、评论和关闭问题。
  4. 项目管理:管理和操作 GitHub Projects。
  5. 代码审查:检查更改、提交评论和批准或拒绝拉取请求。
  6. 扩展性:支持通过脚本和插件进行扩展。

安装 Github-Cli

1
sudo pacman -S github-cli

基本使用

在 GitHub 上取得 Personal Access Token

1. 登录 GitHub 账户

  • 打开 GitHub 并使用你的凭据登录。

2. 进入开发者设置

  • 点击右上角的头像图标。
  • 从下拉菜单中选择 Settings

3. 导航到“Developer settings”

  • 在左侧边栏中找到并点击 Developer settings

4. 生成新的个人访问令牌

  • Developer settings 中,点击 Personal access tokens
  • 点击 Tokens (classic)Fine-grained tokens,具体取决于你需要的权限范围。
    • 如果选择 Tokens (classic)
      • 点击 Generate new token
      • 填写令牌描述。
      • 选择所需的权限范围(例如,repo 表示对仓库的完全控制)。
      • 点击 Generate token
    • 如果选择 Fine-grained tokens
      • 点击 Generate new token
      • 填写令牌名称和描述。
      • 配置资源访问权限(例如,特定组织或仓库)。
      • 配置所需的作用域(例如,读取和写入仓库)。
      • 点击 Generate token

5. 保存令牌

  • 生成后,你会看到新创建的令牌。非常重要的是,此时需要复制并安全地存储这个令牌,因为一旦离开页面,你就无法再次查看该令牌。
  • 不要将令牌泄露给他人,并确保将其存储在一个安全的地方。

6. 使用令牌

  • 你可以使用这个令牌来进行身份验证,例如,在命令行工具中使用 GitHub CLI 登录:
    1
    gh auth login --with-token < your_token_here >

    在本地配置 ssh 后, 可以在第6步中使用令牌登录,选择 ssh, 这种方法可以方便的创建、删除仓库等操作而不用登录网页。

基本操作

  1. 登录和认证(按提示,一步一步认证即可)

    1
    gh auth login

  2. 仓库管理

    新建、列出、查看、删除仓库
    1
    2
    3
    4
    gh repo create my-new-repo --public
    gh repo list
    gh repo view owner/repo
    gh repo delete owner/repo

  3. 拉取请求

    创建、列出、查看、合并、关闭请求
    1
    2
    3
    4
    5
    gh pr create --title "Fix bug" --body "This PR fixes a critical bug."
    gh pr list
    gh pr view 123
    gh pr merge 123
    gh pr close 123

  4. 问题跟踪

    创建、列出、查看、关闭issue
    1
    2
    3
    4
    gh issue create --title "Bug report" --body "I found a bug..."
    gh issue list
    gh issue view 456
    gh issue close 456

  5. 分支管理

    列出、创建、删除分支
    1
    2
    3
    gh branch list
    gh branch create new-feature
    gh branch delete old-feature

  6. 发布管理

    创建、列出、查看release
    1
    2
    3
    gh release create v1.0.0
    gh release list
    gh release view v1.0.0

  7. 用户信息

    查看当前用户、其他用户
    1
    2
    gh api user
    gh api users/username

  8. 组织管理

    列出、查看组织
    1
    2
    gh org list
    gh org view organization-name

引言

在数字化写作和出版领域, LaTeXMarkdown 各自拥有独特的魅力。 LaTeX 是一个高质量的排版系统,尤其擅长处理包含大量数学公式和技术文档;而 Markdown 则以其简单易用的标记语法受到许多写作者的喜爱。然而,随着写作需求的多样化,用户往往希望找到一种方式,既能享受 Markdown 的简洁,又能利用 LaTeX 的强大功能。

markdown 宏包——由 Vít Novotný 维护的一个宏包,它的核心机制使用 Lua 编写,并提供了针对 PlainTeX/LaTeX/ConTeXt 等格式的接口。这个宏包不仅简化了 Markdown 文档到 LaTeX 的转换过程,还允许直接在 LaTeX 中嵌入 Markdown 标记,使得两者之间的协作更加紧密。

使用 markdown 宏包的优势

markdown 宏包具有以下几个显著优势:

  • 无需额外安装:现代 TeX 发行版(如 TeX Live、MiKTeX)通常自带 Lua 解释器,因此只需开启 --shell-escape 标记即可使用 markdown 宏包。
  • 集成良好:相比 Sphinx、Pandoc 等第三方工具,markdown 宏包更好地集成了 LaTeX 系统,避免了转换过程中可能出现的问题。
  • 支持多种环境:提供了 markdown 环境和 \markdownInput 命令,分别用于在 LaTeX 文稿中直接书写 Markdown 内容或从外部文件读取。
  • 预设丰富的宏定义:对于常见的 Markdown 功能,markdown 宏包都预设了相应的 LaTeX 宏实现,例如图片渲染等。

使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
\documentclass{article}
\usepackage{markdown}

\begin{document}

\begin{markdown}
# 标题

这是一个使用Markdown语法书写的段落。可以包括**粗体**、*斜体*、`代码`以及[链接](http://example.com)。

## 列表

- 第一项
- 第二项
- 第三项

## 图片

![示例图片](path/to/image.png "图片标题")

\end{markdown}
\end{document}

实践中的应用

通过 markdown 宏包,我们可以轻松地在 LaTeX 中嵌入 Markdown 标记。例如,当遇到如下 Markdown 图片标签时:

1
![图像标签](路径 "图像标题") 

Lua 解释器会将其翻译成 LaTeX 宏命令:

1
\markdownRendererImage{图像标签}{路径}{路径}{图像标题}

随后,根据 \markdownRendererImage 的定义,TeX 引擎会在后续步骤展开这个宏,完成最终的排版工作。

结论

综上所述,markdown 宏包为我们提供了一种全新的解决方案,使我们可以更方便地使用 Markdown 进行写作,同时享受 LaTeX 的专业排版效果。这对于那些既追求写作效率又重视文档质量的用户来说,无疑是一个理想的选择。正如 Harry Chen 所说:“你喜爱的 Markdown 写作,现更以 LaTeX 呈现。”

参考文章

在DNS解析中,存在多种类型的记录,每种记录都有其特定的用途。本文列举一些常见的DNS记录类型:

  1. A 记录 (Address Record)
    • 将域名映射到IPv4地址。
  2. AAAA 记录 (IPv6 Address Record)
    • 与A记录类似,但将域名映射到IPv6地址。
  3. CNAME 记录 (Canonical Name Record)
    • 指定一个域名是另一个域名的别名,允许多个域名指向相同的IP地址。
  4. MX 记录 (Mail Exchange Record)
    • 指定负责接收发往该域名邮件的邮件服务器。
  5. NS 记录 (Name Server Record)
    • 指明哪些DNS服务器是负责某个域的权威服务器。
  6. PTR 记录 (Pointer Record)
    • 用于反向DNS查找,即将IP地址映射到域名。
  7. SOA 记录 (Start of Authority Record)
    • 包含有关域名的权威信息,包括主名称服务器、序列号等。
  8. SRV 记录 (Service Record)
    • 定义提供特定服务(如SIP、XMPP等)的服务器的位置。
  9. TXT 记录 (Text Record)
    • 允许管理员在DNS中存储文本注释或设置SPF记录以防止垃圾邮件。
  10. CAA 记录 (Certification Authority Authorization)
    • 指定哪些证书颁发机构(CA)被授权为该域名发行证书。

这些记录构成了DNS系统的骨干,确保互联网上的设备能够找到彼此并交换信息。根据需要,还可以配置更多特定用途的DNS记录。

Yarn 简介

Yarn 是一个快速、可靠且安全的依赖管理工具,主要用于 JavaScript 项目。它由 Facebook 与社区成员共同开发,旨在解决 npm(Node Package Manager)存在的性能问题和一些功能上的局限性。Yarn 的设计目标是加速包的安装过程、确保操作的可重复性和安全性,同时简化开发者的工作流程。

主要特点

  • 速度:Yarn 使用并行化下载技术来提升安装速度,并通过本地缓存避免重复下载相同的包。
  • 安全性:每次安装时都会校验每个包的完整性,保证了项目依赖的一致性和安全性。
  • 可重复性:借助 yarn.lock 文件,Yarn 可以确保不同环境中安装的依赖版本完全一致,从而减少了因版本差异导致的问题。
  • 兼容性:与 npm 生态系统完全兼容,能够无缝使用 npm 注册表中的所有包。
  • 插件支持:Yarn 支持丰富的插件生态系统,允许用户扩展其核心功能。
  • 命令简洁:提供了一套简单易用的命令行接口,帮助开发者更高效地管理项目依赖。

yarn 的常用命令列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 查看 yarn 全局安装过的包
yarn global list --depth=0
# 全局安装
yarn global add <package>
# 安装所有依赖
yarn
# 安装指定版本
yarn add <package>@<version>
# 安装最新版本
yarn add <package>
# 删除包,会更新package.json和yarn.lock
yarn remove <package>
# 更新包
yarn upgrade
# 更新指定的包
yarn upgrade <package>
# 获取可更新的包列表选择更新
yarn upgrade-interactive --latest
# 更新全局依赖
yarn global upgrade --latest
# 更新全局依赖,有交互
yarn global upgrade-interactive --latest
# 列出已缓存的包
yarn cache list
# 查找缓存包的路径
yarn cache dir
# 清除缓存的包
yarn cache clean

yarn 使用ssh安装插件

当安装一个模块时,yarn 默认从 https://github.com 下载, 但有时网络不通,所以可以采用直接添加 ssh 地址的方法,此后更新也会从新的地址更新。例如

1
2
yarn add @next-theme/plugins@git+ssh://github.com/next-theme/plugins.git
yarn add hexogenerator-searchdb@git+ssh://github.com/next-theme/hexo-generator-searchdb.git

yarn 切换源

设置 yarn 的国内源

1
2
3
4
# 国内 淘宝 镜像源
yarn config set registry https://registry.npmmirror.com/
# 官方镜像源
yarn config set registry https://registry.yarnpkg.com/

安装 nrm 镜像源工具

1
sudo yarn global add nrm

nrm使用方法,请参考本文末参考文章。使用nrm test列出各源,并给出源的网速,使用nrm use huawei切换到速度最快的华为源。

参考文章

在使用 catecho 等命令,将一些内容添加到root权限的文件,比如/etc/hosts时,系统会报出“权限不够”的错误。

原因分析

以向/etc/hosts中添加一条记录为例,通常代码写为

1
2
sudo echo  "220.181.111.232 www.baidu.com" >> /etc/hosts
-bash: test.asc: Permission denied

此时,bash 拒绝这么做会提示权限不够,是因为重定向符号 >>> 也是 bash 的命令。由于使用 sudo 只是让 echo 命令具有了 root 权限,但是没有让 >>> 命令也具有 root 权限,所以 bash 会认为这两个命令都没有向/etc/hosts写入信息的权限。

解决方法

使用命令sh -c

sh -c 命令,可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。具体用法如下:

1
sudo sh -c 'echo  "220.181.111.232 www.baidu.com" >> /etc/hosts'

使用命令tee

利用管道和 tee 命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,具体用法如下:

1
echo  "220.181.111.232 www.baidu.com" | sudo tee -a /etc/hosts

注意: tee 命令的 -a 选项的作用等同于 >> 命令。如果去除该选项,那么 tee 命令的作用就等同于 > 命令。

参考文章

今天升级 ArchLinu 后发现 sudo 命令无法接收密码,即使正确的密码它也会返回 "密码错误" 的提示。修复方法有三个:

注销并重新登录会话

重新启动 Linux 系统是修复任何临时系统故障的最流行且最简单的解决方案之一。在最好的情况下,sudo 密码不起作用错误只是 Linux 中的一个临时故障,只需快速注销登录或重新启动系统即可神奇地修复它。

修改sudo密码

  1. 打开一个新的终端。
  2. 使用命令su, 切换到 root用户。
  3. 使用 passwd 命令,更改用户的sudo密码: passwd username

多数情况下我们习惯了某一密码,所以尽量不使用本方法修改密码。

重启systemd-homed服务

systemd-homed 是一个核心 systemd 服务,负责为用户的主目录提供支持。重新启动它可能会解决该问题,因为它会重置身份验证机制并可能修复任何临时系统故障。重新启动服务的步骤:

  1. 启动一个新终端。
  2. 使用 su 命令切换到 root
  3. 使用systemctl命令启动或重新启动systemd-homed服务:
    1
    2
    systemctl start systemd-homed.service
    systemctl restart systemd-homed.service

2025年01月03日, 使用此方法解决问题,建议使用此方法。

参考文章