Shell脚本变量与函数变量
在 shell 脚本中使用$1
, $2
等表示变量,它们不仅可以表示脚本的参数,也可以表示函数的参数。但是,如果一个函数它自己有参变量,同时又需要引用脚本的参变量,那这个函数就无法识别$1
是脚本的还是函数的,这会导致矛盾。为了解决函数参数覆盖脚本参数的问题,一个简单安全的方法是提前保存脚本参数,即
1 | #!/bin/bash |
此法能确保在函数中正确访问脚本参数,同时保持代码清晰和可维护性。
这里需要注意变量$0
和$?
不会被函数参数覆盖,这里将各变量列表如下:
变量 | 是否被函数参数覆盖 | 作用域 | 说明 |
---|---|---|---|
$0 |
否 | 全局 | 始终表示脚本名称 |
$? |
否 | 动态更新 | 始终表示上一个命令的退出状态 |
$1-$9 |
是 | 函数内局部 | 在函数内被函数参数覆盖 |
$# |
是 | 函数内局部 | 在函数内表示函数参数个数 |
$@ |
是 | 函数内局部 | 在函数内表示函数参数列表 |
所以综合考虑,将$0
也在脚本开头保存,以便规范使用。于是前面的脚本可以进一步写为:
1 | #!/bin/bash |
Shell脚本获取终端尺寸
在编写 shell
脚本时经常使用的函数可以封闭到一个脚本中,然后其他脚本使用 source
命令直接调用即可,这样不仅有利于新脚本的开发,更有利于维护。但是今天在编写新的脚本
chaos.sh
时调用了我之前在diary.sh
中调用过的菜单脚本,然而却出现错误。一直提示"
stty: 标准输入: 对设备不适当的 ioctl 操作" 。
造成这个问题的原因是:使用 Neovim
内置命令运行脚本时并没有真正在一个终端中运行,而菜单脚本使用tty
获取终端的尺寸,此时没有可用的tty
,
因此出现报错。
一个更健壮的获取终端尺寸的方法(在非终端环境下,如 Neovim
:!sh ./chaos.sh
等也不会报错),是使用tput
,
这是一具兼容度最好的方案。具体原因是
tput
会尝试从环境变量或terminfo
中获取尺寸- 在非终端环境下返回空或错误,可用
||
提供默认值 - 不会像
stty size
那样报错
一般情况下,使用stty size
与
tput
会获得相同的结果,为了确保与之前脚本的兼容性,修改获取尺寸函数为:
1 | # 列表程序 |
通过[ -t 0 ]
来判断运行程序时是否在终端,若在终端仍然使用stty size
获取终端尺寸,否则使用tput
获取。这样重新定义获取尺寸函数后,问题彻底解决。
Mason加速下载
Neovim 配置好 LSP 后可以极大的增强功能,其中 Mason
可以方便的管理和配置 LSP, 而 ltex-ls
可以实现离线latex
,
markdown
等的语法检测,所以这是一个重要 LSP.
然而,在近几天使用 Neovim
打开
latex
文件时总是报错如下:
1 | JDK 24 - Cannot load or parse input stream of '/org/languagetool/rules/en/grammar.xml' |
根据 https://github.com/languagetool-org/languagetool/issues/11125
的提示,将ltex-ls
替换为ltex-ls-plus
可以解决问题,同时后者是前者的增强版本也是一个更好的选择。但是在安装时发现ltex-ls-plus
的体积非常大,使用Mason直接安装多次未成功。于是将Maso
的默认下载工具调整为aria2
,
实现了快速下载,最终成功安装ltex-ls-plus
.
安装 aria2
1 | sudo pacman -S aria |
配置 Mason
设置如下:
1 | require("mason").setup({ |
为方便使用,我的完整文件内容展示如下:
1 | -- :h mason-default-settings |
Hexo博客重置
2025年07月25日星期五,
今天是离开北师大后第一次更新博客,原因是一直没有时间来重新配置系统。在新电脑上启用diary.sh
脚本时,需要提前配置好hexo
,
因为直接clone
博客仓库后,使用hexo s
和hexo g
均报错:
1 | Error: Cannot find module './db.json' |
解决方法为:使用yarn
对应的命令清理缓存和重装.
1 | yarn cache clean |
之后使用hexo g
, 重新生成仓库后问题解决。
File-Roller解压缩乱码问题的解决
在 Linux 使用系统自带的 File-Roller
文件归档器解压缩文件时有时会遇到中文文件名解压后乱码的问题,此时我们可以使用命令行工具unar
执行unar yourfile.zip
实现中文名文件的解压缩,但是对于正在进行图形工作的任务时,切换命令行会降低效率。因此,解决
File-Roller 的中文解压缩乱码问题是一个相当重要的问题。
乱码的原因
- 编码不一致(主要原因):Windows (GBK)和 Linux (UTF-8)系统下默认的字符编码不同,导致在交叉使用时出现乱码。
- 软件版本问题:某些软件版本对编码支持不全,也会导致乱码的出现。
旧版本 File-Roller 解决方案
- 打开 File-Roller, 选择 “工具” 菜单中的 “配置文件管理器” 。
- 在 “编码” 选项卡中,将 “自动检测” 设置为
“否”,并手动添加
GB18030
,GBK
,GB2312
等编码。 - 保存并关闭配置文件管理器。
新版本 File-Roller 解决方案
在 GNOME 48
环境下,File-Roller(归档管理器)的界面已更新,不再提供旧版的 工具
菜单和
配置文件管理器。但底层仍支持通过配置文件(fr-encodings.json
)自定义编码列表。修改配置文件后,
File-Roller 会优先使用列表中的编码尝试解压(等同于关闭自动检测)。
- 打开终端。
- 编辑 File-Roller 的配置文件:
1
2mkdir ~/.config/file-roller
nvim ~/.config/file-roller/fr-encodings.json - 将以下内容粘贴到文件中:
1
2
3
4
5
6
7
8
9{
"encodings": [
"GB18030",
"GBK",
"GB2312",
"UTF-8",
"CURRENT"
]
}GB18030
,BGK
,BG2312
是手动添加的中文编码。UTF-8
,CURRENT
是保留的默认编码。
- 重启 File-Roller 即可生效。
解压时手动选择编码
- 双击打开压缩文件。
- 点击右上解的
⋮(菜单)
→使用其他编码打开...
。 - 从列表中选择
GB18030
,BGK
或GB2312
。
SuperTuxKart解锁所有关卡
办公累了,偶尔也找款游戏玩玩,其中 SuperTuxKart 类似于 Windows 下的泡泡卡丁车。由于 Linux 的开源特性,我们可以直接修改配置文件而解锁所有关卡。方法是:
- 找到本地配置文件
~/.config/supertuxkart/config-0.10/players.xml
- 找到标签
<story-mode>
, 然后修改solved="none"
为solved="easy"
或solved="hard"
. - 修改好的文件内容为:
~/.config/supertuxkart/config-0.10/players.xml 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
29
30
31<story-mode first-time="false" finished="false" speedrun-finished="false"
story-ms="1023726" speedrun-ms="1291839">
<abyss solved="easy" best_while_slower="false"/>
<candela_city solved="easy" best_while_slower="false"/>
<cocoa_temple solved="easy" best_while_slower="false"/>
<cornfield_crossing solved="easy" best_while_slower="false"/>
<fortmagma solved="easy" best_while_slower="false"/>
<gp1 solved="easy" best_while_slower="false"/>
<gp2 solved="easy" best_while_slower="false"/>
<gp3 solved="easy" best_while_slower="false"/>
<gp4 solved="easy" best_while_slower="false"/>
<granparadiso_island solved="easy" best_while_slower="false"/>
<green_valley solved="easy" best_while_slower="false"/>
<hacienda solved="easy" best_while_slower="false"/>
<lighthouse solved="easy" best_while_slower="false"/>
<mansion solved="easy" best_while_slower="false"/>
<mines solved="easy" best_while_slower="false"/>
<minigolf solved="easy" best_while_slower="false"/>
<olivermath solved="easy" best_while_slower="false"/>
<sandtrack solved="easy" best_while_slower="false"/>
<scotland solved="easy" best_while_slower="false"/>
<snowmountain solved="easy" best_while_slower="false"/>
<snowpeak solved="easy" best_while_slower="false"/>
<stk_enterprise solved="easy" best_while_slower="false"/>
<unlock_bonus_kart1 solved="easy" best_while_slower="false"/>
<unlock_bonus_kart2 solved="easy" best_while_slower="false"/>
<unlock_supertux solved="easy" best_while_slower="false"/>
<volcano_island solved="easy" best_while_slower="false"/>
<xr591 solved="easy" best_while_slower="false"/>
<zengarden solved="easy" best_while_slower="false"/>
</story-mode>
Gnome3中的现代阅读器papers取代evince
简介
GNOME 近年来正在转向 GTK4 + LibAdwaita。核心应用程序要么移植到新框架,要么被新框架替换。Papers 是一款专门为 GNOME 桌面环境打造的强大「文档查看器」。它支持多种文档格式,能够轻松查看、搜索和批注文档,为用户带来更丰富的使用体验。
目前,Papers 支持的文档格式包括:PDF、PS、EPS、XPS、DjVu、TIFF,以及漫画书档案(CBR、CBT、CBZ 和 CB7 格式)。无论常见文档还是特殊格式,Papers 都能轻松搞定,堪称 GNOME 用户的得力助手。
安装
1 | sudo pacman -S papers |
参考文章
Gnome3桌面环境下的现代播放器
伴随 Gnome 的升级迭代,一些软件开始变得不再特别适配新的系统,因此本文介绍三款更加现代的播放器:Decibels 音乐播放器,Showtime 视频播放器,Clapper 视频播放器。
Showtime 视频播放器
Showtime 是一款即将在GNOME 49桌面环境中替代Totem视频播放器的新应用。它基于GTK4和libadwaita构建,强调提供沉浸式的观影体验。该播放器采用无边框窗口设计,控制界面默认隐藏,以便用户能够专注于视频内容展示。
特性:
- 技术栈:使用GStreamer支持多种音视频文件格式。
- 功能集:调节播放速度、切换字幕与音轨、旋转画面、循环播放等。
- 限制:当前版本不支持DVD播放。
安装:
1 | sudo pacman -S showtime |
Clapper 视频播放器
Clapper 是一款专为GNOME桌面环境打造的媒体播放器,采用了最新的GTK4工具包和GStreamer引擎,并且利用OpenGL进行渲染。这款播放器以其简约的设计理念著称,旨在为用户提供一个既现代又易于使用的视频观看体验。
特性:
- 易用性:直观的用户界面,无需复杂的配置过程。
- 核心功能:基本但必要的视频播放功能,极简主义设计。
- 技术细节:包括Clapper库(负责播放逻辑)和ClapperGtk库(确保与GTK4的无缝整合)。
- 扩展性:支持GObject Introspection绑定,提供了Rust语言的绑定选项。
安装:
1 | sudo pacman -S clapper |
Decibels 音乐播放器
Decibels 是GNOME 48中引入的核心音频播放器,用于填补GNOME桌面环境中长期缺乏官方音频播放解决方案的空白。该项目从GNOME孵化器项目中晋升为核心应用程序。
特性:
- 技术栈:使用TypeScript编写,基于GTK4工具包和libadwaita。
- 简单功能:目前作为一款非常基础的音频播放器运作。
- 挑战:由于编程语言的选择,可能会面临短期内在一些Linux发行版中的集成障碍。
安装:
1 | sudo pacman -S decibels |
安装 GStreame 插件
为了进一步增强前述播放器支持的播放格式,安装相应的 GStreame 插件。
1 | sudo pacman -S lsp-plugins-gst |
参考文章
投稿后如何通过期刊统一邮箱与指定编辑A进行沟通
在学术投稿过程中,即使你的稿件已经分配给了特定的编辑(例如编辑 A),所有的邮件交流通常都是通过期刊提供的统一邮箱进行的。那么,这些发送到统一邮箱的邮件是如何被编辑 A 获取并处理的呢?本文将详细解释这一过程。
期刊统一邮箱的工作机制
统一邮箱作为前端接口
大多数期刊采用一个统一的投稿邮箱作为外部通信的接口。所有与作者、审稿人和编辑之间的交流都通过这个邮箱进行中转,但实际上它只是一个自动化系统的出口/入口,背后有一个完整的投稿管理系统支持(如 Editorial Manager、ScholarOne 等)。
稿件分配给编辑 A
当稿件进入系统后,主编会根据情况指派一位责任编辑(如编辑 A )。该编辑将在投稿系统中查看他/她负责的所有稿件,并能够访问相关的通信记录、审稿意见及作者回复等信息。
后续邮件交流流程
发送邮件至统一邮箱
当你回复了期刊提供的统一邮箱时,系统会自动识别出这封邮件是关于哪篇稿件的(基于邮件主题、稿件编号等信息)。随后,系统会将你的回复同步到投稿系统中,并通知编辑 A 有新的消息需要关注。
编辑 A 处理邮件
编辑 A 登录投稿系统后可以看到你的回复内容,而无需直接通过个人邮箱参与交流。这种方式确保了所有沟通都有记录可查,避免了因编辑更换或离职导致的信息丢失风险。
小贴士
- 在回复邮件时,请保留邮件标题中的稿件编号(如Manuscript ID: XYZ123),以帮助系统正确识别。
- 如果担心邮件未被收到,可以通过投稿系统检查是否有新的状态更新(如 Under Review, Required Reviews Completed 等)。