- 开发工具
【免费下载链接】xonsh
🐚 Python-powered shell. Full-featured, cross-platform and AI-friendly.
xonsh 是一款 Python 驱动的跨平台 shell,其别名(alias)系统是它区别于传统 shell 的核心机制之一。本文以官方文档 docs/aliases.rst 为骨架,系统梳理 xonsh 的内建别名(包括cd、ls、grep等常见命令,xpython、xxonsh、showcmd等 xonsh 特有命令),并深入讲解@json、@xml、@path等命令装饰器、目录栈、作业控制、source-foreign系列源码别名以及带描述的用户别名定义方式。读完本文,你将能够在日常会话和 RC 文件中熟练使用这些别名,并理解其底层实现(对应 xonsh/aliases.py)。
一、常用命令别名(Well-known Commands)
cd:切换目录
cd命令用于切换当前工作目录;如果不带任何参数,则切换到当前用户的主目录(home directory)。在源码中,cd与pushd/popd/dirs一样,由 xonsh/dirstack.py 提供实现,并在 xonsh/aliases.py#L1676 处注册进默认别名表。
cd # 回到 home 目录 cd /var/log # 切换到指定目录ls:平台相关的彩色列表
ls别名在不同平台上展开为不同参数(见 xonsh/aliases.py#L1825-L1842):
| 平台 | 展开后的别名值 |
|---|---|
| Linux | ['ls', '--color=auto', '-v'] |
| macOS / FreeBSD / DragonFlyBSD | ['ls', '-G'] |
| NetBSD / OpenBSD | 不定义ls别名,直接调用系统ls |
注意 Linux 上的-v是 GNUls的"自然排序"选项(版本排序),而 macOS 上的-G启用彩色输出。由于别名值是字符串列表,你可以随时覆盖它:
aliases['ls'] = ['ls', '--color=auto', '-F'] # 追加文件类型符号grep:默认启用颜色
grep被别名为['grep', '--color=auto']。在 FreeBSD、NetBSD、DragonFlyBSD 上还会额外注册egrep、fgrep的彩色别名(Linux 上同样注册这三者);OpenBSD 上不定义任何 grep 系列别名。
timeit:计时工具
timeit对参数进行计时研究,功能类似 IPython 的%timeit魔法。其实现来自 xonsh/timings.py 中的timeit_alias:
timeit sleep 0.1 # 测量一条命令的执行时间 timeit python -c "sum(range(1000))"exit/quit/EOF:安全退出
exit、EOF、quit三个名字都映射到同一个动作:以安全的方式退出 xonsh。按Ctrl-d等同于输入EOF并回车。其底层实现是 xonsh/aliases.py#L971 的xonsh_exit:它先调用clean_jobs()确保没有未清理的作业,然后从参数中解析退出码(解析失败则视为 1,无参数则视为 0),写入XSH.exit。
特别地,exit N会把 shell 的退出码设置为N,并停止当前脚本的剩余部分:
@ xonsh -c 'echo 1; exit 42; echo 3' 1 @ @.lastcmd.rtn 42echo 3没有被执行,且退出码为 42。
二、xonsh 特有别名(Xonsh-specific Aliases)
history:历史记录管理
history提供 xonsh 历史记录的全部管理工具,包括所有子命令。完整用法参见 docs/history.rst。其实现为 xonsh/history/main.py 中的history_main:
history show # 显示历史 history file # 显示历史文件路径 history clear # 清空历史showcmd:查看命令求值结果
showcmd以字符串列表的形式展示 xonsh 在子进程模式下会如何执行一条命令及其参数,用于调试参数展开、$()捕获、@()列表与引号处理。使用-e/--expand-alias展开别名(实现见 xonsh/aliases.py#L1465):
@ showcmd echo The @('args') @(['list', 'is']) $(echo here) "and" --say="hello" to @([]) you ['echo', 'The', 'args', 'list', 'is', 'here', 'and', '--say="hello"', 'to', 'you'] @ showcmd ls ls @ showcmd -e ls ['ls', '--group-directories-first', '-A', '--color']对比两次输出可见:不带-e时只显示字面命令名,带-e时则递归展开为最终执行的参数列表。它同样适用于自己定义的别名:
@ aliases['ali'] = 'echo 1' @ showcmd -e ali 2 ['echo', '1', '2']xonfig:配置管理
xonfig管理 xonsh 的配置信息,其实现为 xonsh/xonfig.py 中的xonfig_main,通过懒加载注册(见 xonsh/aliases.py#L1446-L1451):
xonfig # 交互式查看/修改配置 xonfig wizard # 基于向导的配置 xonfig info # 打印环境与依赖信息xontrib:扩展管理
xontrib管理 xonsh 的扩展(xontrib),详见 docs/xontrib.rst,实现位于 xonsh/xontribs.py:
xontrib list # 列出可用/已加载扩展 xontrib load vox # 加载扩展xcontext:报告当前 xonsh 环境
xcontext报告当前 xonsh 环境的信息,包括 Python 解释器、pip、xonsh 自身的路径以及相关环境变量。其实现为 xonsh/xoreutils/xcontext.py 中的xcontext_main:
@ xcontext [Current xonsh session] xxonsh: /home/snail/.local/xonsh-env/bin/xonsh xpython: /home/snail/.local/xonsh-env/bin/python # Python 3.12.10 xpip: /home/snail/.local/xonsh-env/bin/python -m pip [Current commands environment] xonsh: /home/snail/.local/xonsh-env/bin/xonsh python: /usr/bin/python # Python 3.11.6 pip: /usr/bin/pip CONDA_DEFAULT_ENV: my-env默认情况下,输出中的符号链接会被解析为真实路径;传入--no-resolve(-n)则显示原始路径。此外还支持--as-json以 JSON 形式输出(对应源码中的as_json参数)。从源码结构看,它使用XContext对象统一收集"当前 xonsh 会话"与"当前命令环境"两组路径信息,并在--no-resolve模式下仍以红色标出失效条目。
xpip:xonsh 自己的 pip
xpip运行与 xonsh 自身绑定的pip包管理器,非常适合 xonsh 位于隔离环境(conda、mamba、homebrew)中的安装场景。其实现get_xpip_alias()(xonsh/aliases.py#L1542)返回[sys.executable, "-m", "pip"],并在特殊场景下自动调整:
- AppImage环境下使用
$_指向的真实 Python 解释器; - Python 可执行文件所在目录不可写(典型如系统级安装)时,自动包装成在
pip install后追加--user,把包装进当前用户目录; - Windows 上直接返回基础命令。
@ which pip /usr/bin/pip # system pip @ which xpip /home/snail/.local/xonsh-env/bin/python -m pip # current xonsh session pip @ xpip install fire @ import fire @ fire <module 'fire' from '/home/snail/.local/xonsh-env/lib/python3.11/site-packages/fire/__init__.py'>xpip install装出的包与当前 xonsh 会话共享同一个 Python 环境,因此import fire立即可用。
xpython:当前解释器
xpython是正在运行 xonsh 的 Python 解释器(即sys.executable)的别名,用于在与 shell 自身相同的环境中运行 Python 模块或脚本,特别适合 AppImage 等复杂安装场景:
@ python -V Python 3.12.10 @ xpython -V Python 3.11.9 @ which python /opt/homebrew/bin/python @ which xpython /home/snail/.local/xonsh-env/bin/python从 xonsh/aliases.py#L1722-L1724 可见,AppImage 下其值为[$_, sys.executable]($_是 AppImage 内置的真实解释器),否则为[sys.executable]。
xxonsh:启动与当前会话完全相同的 xonsh
xxonsh启动与启动当前会话完全相同的那个 xonsh——相同的解释器、相同的源码树,与当前工作目录或site-packages中安装的内容无关。记忆法:把开头的x想成c,即(c)urrent xonsh。
其实现get_xxonsh_alias()(xonsh/aliases.py#L1494)总是返回一个列表,方便与其他 argv 拼接:
- 通过入口点启动时(
sys.argv[0]是可执行绝对路径),返回[current_xonsh]; - 通过
python -m xonsh从源码启动时,为避免"当前工作目录"污染sys.path导致加载错误,会计算xonsh包所在目录,并生成一段python -c引导代码把该目录插入sys.path后再导入xonsh.main。
一个经典用法是把它作为构建块启动tmux(即xtmux配方),详见 docs/launch.rst#L128:
aliases['xtmux'] = ['tmux', 'new-session'] + @.imp.xonsh.aliases.get_xxonsh_alias()xreset:清空 xonsh 上下文
xreset清理 xonsh 的上下文(context),删除所有用户变量。其实现是 xonsh/aliases.py#L987 的xonsh_reset,即清空XSH.ctx:
@ a=1 @ a 1 @ xreset @ a Not foundtrace:执行前打印源码行
trace提供在执行源代码行之前将其打印出来的接口,实现位于 xonsh/tracer.py 的tracermain(注册时被标记为@unthreadable,见 xonsh/aliases.py#L1454-L1462):
trace -h # 查看完整选项 trace myscript.xsh # 逐行追踪执行exec与xexec:同进程替换
exec(别名xexec)使用os.execvpe()用指定程序替换当前 xonsh 进程,等价于 bash 的exec内建。实现在 xonsh/aliases.py#L1354:
exec bash -l -i bash $支持的选项:
| 选项 | 含义 |
|---|---|
-l,--login | 在传给命令的第零个参数前加-,模拟登录 shell |
-c,--clean | 以空环境执行命令 |
-a,--name | 把name作为第零个参数传给被执行的命令 |
源码细节:非--clean时会 detype 当前环境,并把$SHLVL减一以对齐 bash 行为;同时清理__ALIAS_STACK/__ALIAS_NAME,避免新进程误判别名递归(对应 PR #6198)。若目标不是二进制(Exec format error),会回退到通过 shebang 解析成脚本子进程命令再执行。
⚠️ 注意:exec与 Python 内建函数exec()不是一回事——后者用于执行 Python 代码。发生名字冲突时,请直接使用xexec,或显式进入子进程模式![exec command]。
三、命令装饰器(Command Decorators)
命令装饰器是一组以@开头的特殊别名,用于在单条命令上修改子进程的捕获/线程/格式行为。它们在 xonsh/aliases.py#L1726-L1807 中注册为SpecAttrDecoratorAlias,本质上是在执行前向命令 spec 注入对应属性。
@error_raise与@error_ignore:命令级错误控制
用@error_raise让命令返回非零退出码时抛出异常——类似$XONSH_SUBPROC_CMD_RAISE_ERROR,但作用域限于单条命令,且无条件抛出(即使在&&/||链中、即使$XONSH_SUBPROC_RAISE_ERROR被关闭)。用@error_ignore显式抑制抛出,它同样优先于$XONSH_SUBPROC_RAISE_ERROR的链式结果检查:
@ r = !(@error_raise ls nonono) subprocess.CalledProcessError: Command '['@error_raise', 'ls', 'nonono']' returned non-zero exit status 1. @ r = !(@error_ignore ls nonono)@thread与@unthread:线程行为
@thread/@unthread把命令标记为可线程化/不可线程化。例如,为了获取 SSH 命令的结果(需要线程化以读取输出):
@ !(@thread ssh host -T "echo 1")@path与@paths:输出转 Path 对象
@path把命令输出的第一行转换为一个pathlib.Path对象;@paths把每一行转换为Path对象列表(跳过空行)。底层转换函数是 xonsh/aliases.py#L1657-L1670 的_output_to_path_object/_output_to_path_objects:
@ dir = $(@path echo '/bin') dir.exists() @ dirs = $(@paths echo '/bin\n/etc') [p.exists() for p in dirs]@lines:输出转行列表
@lines把命令输出作为行列表返回(对应output_format: "list_lines",等价于$XONSH_SUBPROC_OUTPUT_FORMAT设为list_lines):
@ lines = $(@lines cat file)@stream:输出转行流
@stream把命令输出作为行流返回(stream_lines)。当$XONSH_SUBPROC_OUTPUT_FORMAT为list_lines时尤为有用:
@ str = $(@stream cat file)@json:解析 JSON
@json把命令输出解析为 JSON 对象(底层是json.loads("\n".join(lines))):
@ data = $(@json curl https://example.com/data.json)@jsonl:解析 JSON Lines
@jsonl按行解析 JSON,返回 JSON 对象列表:
@ items = $(@jsonl cat data.jsonl)@yaml:解析 YAML
@yaml把命令输出解析为字典(yaml.safe_load):
@ config = $(@yaml cat config.yaml)@toml:解析 TOML
@toml把命令输出解析为字典(使用标准库tomllib.loads):
@ config = $(@toml cat pyproject.toml)@xml:解析 XML
@xml使用标准库xml.etree.ElementTree把输出解析为Element对象,可用.tag、.attrib、.text、.find()、.findall()等导航:
@ feed = $(@xml curl -s https://github.com/xonsh/xonsh/releases.atom) ns = {'a': 'http://www.w3.org/2005/Atom'} [e.find('a:title', ns).text for e in feed.findall('a:entry', ns)[:5]] ['v0.23.6', 'v0.23.5', 'v0.23.4', 'v0.23.3', 'v0.23.2']@lxml:基于 lxml 的 XML 解析
@lxml使用 lxml 解析 XML,返回lxml.etree._Element,在标准库@xml之上提供完整 XPath、更丰富的错误信息与更快的解析速度。仅当安装了 lxml 时才注册(xonsh/aliases.py#L1798-L1807 通过importlib.util.find_spec("lxml")判断),安装方式:xpip install lxml:
@ feed = $(@lxml curl -s https://github.com/xonsh/xonsh/releases.atom) ns = {'a': 'http://www.w3.org/2005/Atom'} feed.xpath('//a:entry/a:title/text()', namespaces=ns)[:5] ['v0.23.6', 'v0.23.5', 'v0.23.4', 'v0.23.3', 'v0.23.2']四、目录栈(Directory Stack)
目录栈由 xonsh/dirstack.py 实现,三个命令共用同一个全局栈DIRSTACK,并提供-n、-q、+N/-N旋转等细节(对应 bash 语义)。
pushd:压栈并切换
pushd把一个目录加到目录栈顶部(新顶部即当前工作目录),或通过+N/-N旋转栈:
| 参数 | 含义 |
|---|---|
dir | 把dir设为栈顶并cd过去 |
+N | 把dirs列表从左数第 N 个(从 0 开始)目录旋转到栈顶 |
-N | 把dirs列表从右数第 N 个目录旋转到栈顶 |
-n | 只操作栈,不切换目录 |
-q | 静默模式,不调用dirs显示结果 |
pushd /tmp # 保存当前目录并进入 /tmp pushd -n /var/log # 仅压栈,不切换 pushd +1 # 旋转栈实现细节:Windows 上遇到 UNC 路径(\\<server>\<share>)且未开启DisableUNCCheck注册表项时,会像 CMD 的PUSHD一样临时映射一个盘符。栈大小受$DIRSTACK_SIZE限制,超出部分被截断。
popd:弹栈
popd从目录栈中移除条目并切换到新的栈顶,参数语义与pushd的+N/-N一致:
popd # 弹出一个目录并切换过去 popd +2 # 弹出左边第 2 个条目dirs:查看与清空
dirs显示当前记住的目录列表,也可用于清空目录栈:
dirs # 列出目录栈 dirs -c # 清空目录栈五、作业控制(Jobs)
作业控制别名由 xonsh/procs/jobs.py 提供。
jobs:列出当前作业
jobs显示所有当前作业列表,支持--posix以 POSIX 风格输出(见 xonsh/procs/jobs.py#L583):
jobs jobs --posixfg:转到前台
fg把当前活动作业带到前台;给定一个数字参数则把该作业带到前台。此外支持+(最近操作的作业)与-(次近的作业)两种速记:
fg # 恢复最近挂起的作业到前台 fg 3 # 恢复作业 3bg:转到后台
bg在后台恢复执行当前活动作业,或恢复指定编号的作业:
bg # 后台恢复最近挂起的作业 bg 3 # 后台恢复作业 3源码中fg/bg共用resume_job()(xonsh/procs/jobs.py#L596):前台恢复时tee_output=True把输出接到终端,后台恢复则不 tee 输出,并把作业标记为bg=True、status=running。
disown:脱离作业表
disown的行为与 zsh 的disown一致:把指定作业从作业表中移除,shell 不再报告其状态,退出交互 shell 时也不会因它们仍在运行/停止而抱怨。未指定作业时,disown 当前作业。
- 如果作业处于停止状态且设置了
$AUTO_CONTINUE = True,会打印一条警告,说明如何让它们在被 disown 后继续运行; - 如果使用了
-c/--continue(force_auto_continue),作业会被自动置为运行状态,与$AUTO_CONTINUE的设置无关。
disown # 脱离当前作业 disown 2 5 # 脱离作业 2 和 5 disown -c 3 # 脱离作业 3 并自动继续运行六、源码类别名(Source Aliases)
source:执行 xonsh/Python 文件
source在当前上下文中执行给定文件的内容,仅适用于 xonsh 和 Python 文件(*.xsh、*.py)。使用-e忽略扩展名限制:
source myscript.xsh source -e somefile.txtsource-foreign:source 外来 shell 文件
source-foreign用于 source 外来(非 xonsh)语言编写的文件,会拾取目标 shell 的环境变量和别名。支持的外来 shell:bash、zsh、sh(以及dash、ash、ksh、mksh、pdksh),Windows 上支持cmd。/bin/bash、/bin/sh这类绝对路径会被规范化到同名默认 shell。
source-foreign bash /etc/profile source-foreign --sourcer . /etc/profile # 指定 POSIX dot 内建 source-foreign zsh --show-output ~/.zshrc # 转发 stdout/stderr其实现source_foreign_fn(xonsh/aliases.py#L992)参数非常丰富,常用选项包括:
| 选项 | 含义 |
|---|---|
-i,--interactive | 以交互模式运行外来 shell |
-l,--login | 以登录模式运行外来 shell |
--envcmd | 打印环境变量的命令 |
--aliascmd | 打印别名的命令 |
--extra-args | 运行该 shell 所需的额外参数 |
-u,--unsafe | 不安全模式:出错时也不抛错 |
-p,--prevcmd | 在 source 之前先运行的命令(替代传统 source) |
--postcmd | 在所有命令之后运行的命令 |
--sourcer | 目标 shell 语言中的 source 命令;不指定时按 shell 名查默认值 |
--use-tmpfile | 把 source 命令写入临时文件执行 |
--seterrprevcmd/--seterrpostcmd | 在前后设置 exit-on-error 的命令 |
--overwrite-aliases | 覆盖同名 xonsh 别名 |
--suppress-skip-message | 抑制跳过提示(也可用$FOREIGN_ALIASES_SUPPRESS_SKIP_MESSAGE = True) |
--show | 显示将发给外来 shell 的生成命令 |
--show-output | 把 source 脚本产生的 stdout/stderr 转发到终端(默认静默丢弃) |
-d,--dry-run | 实际不 source |
源码行为要点:source 成功后,环境变量差异会写回 xonsh 环境($SHLVL被忽略,未在脚本中出现的原变量会被移除);别名冲突时默认跳过并打印提示,可用--overwrite-aliases强制应用。
source-sh:POSIX 友好包装
source-sh是source-foreign sh配合--sourcer .的薄包装——因为 dash 系发行版上的/bin/sh不理解source内建,改用 POSIX 点号内建。适用于 source/etc/profile之类的 POSIX 配置文件,同时覆盖dash、ash、ksh、mksh、pdksh(环境与别名会被拾取,但 shell 专属的函数列表不可用)。
source-bash与source-zsh
source-bash是source-foreign bash --sourcer source的薄包装,source-zsh是source-foreign zsh --sourcer source的薄包装。三者都是 xonsh/aliases.py#L1691-L1709 中通过functools.partial预置参数构造的SourceForeignAlias,因此source-foreign接受的每个标志在它们身上同样可用:
source-bash ~/.bashrc source-zsh -l ~/.zprofile source-sh /etc/profile七、Windows 别名(Windows Aliases)
基于 cmd 的别名
在 Windows 上,以下别名被展开为['cmd', '/c', alias](实际源码用_find_cmd_exe()解析出cmd.exe的绝对路径,避免依赖可能被改写的COMSPEC,见 xonsh/aliases.py#L1597-L1628):
{'cls': ['cmd', '/c', 'cls'], 'copy': ['cmd', '/c', 'copy'], 'del': ['cmd', '/c', 'del'], 'dir': ['cmd', '/c', 'dir'], 'erase': ['cmd', '/c', 'erase'], 'md': ['cmd', '/c', 'md'], 'mkdir': ['cmd', '/c', 'mkdir'], 'mklink': ['cmd', '/c', 'mklink'], 'move': ['cmd', '/c', 'move'], 'rd': ['cmd', '/c', 'rd'], 'ren': ['cmd', '/c', 'ren'], 'rename': ['cmd', '/c', 'rename'], 'rmdir': ['cmd', '/c', 'rmdir'], 'time': ['cmd', '/c', 'time'], 'type': ['cmd', '/c', 'type'], 'vol': ['cmd', '/c', 'vol'], }此外 Windows 上还额外注册:call/source-bat→source-cmd,clear→cls。
Anaconda 下的activate/deactivate
在安装了 Anaconda Python 发行版的 Windows 上,activate和deactivate被别名为['source-cmd', 'activate.bat']和['source-cmd', 'deactivate.bat'],从而可以用与 cmd.exe 中相同的命令来激活/停用 conda 环境:
activate myenv deactivate源码判断条件(xonsh/aliases.py#L1815-L1822):xonsh 安装在 conda 环境内(ON_ANACONDA),或$PATH中存在conda启动器时,才会注册这两个别名。
Windows 上的sudo
在 Windows 上,如果找不到名为sudo的可执行文件,xonsh 会添加一个sudo别名,借助ShellExecuteEx和ctypes补全"以管理员运行"行为(xonsh/aliases.py#L1632 的win_sudo)。它不支持真正的sudo参数,只接受要运行的命令:
sudo cmd /k whoami # 触发 UAC 提升后执行八、带描述的用户别名(User Aliases with Descriptions)
一行描述的作用
每个别名都可以携带一行描述(doc),它会出现在:
- Tab 补全下拉框中别名名称旁边;
cmd?/cmd??帮助输出中。
对于可调用别名(callable alias),函数 docstring 会被自动用作描述(xonsh/aliases.py#L149-L200 的FuncAlias会把__doc__等属性继承过来):
@ @aliases.register('qwe') def _qwe(): """List files in long format.""" ls -la @ qw<TAB> qwe List files in long format.对于字符串/列表别名——它们没有地方挂 docstring——使用字典形式:
@ aliases['qwe'] = {'alias': 'ls -la', 'doc': 'List files'} @ aliases |= { 'psg': {'alias': ['ps', 'aux'], 'doc': 'Process list'}, 'g': {'alias': 'git', 'doc': 'Git wrapper'}, }字典形式的键规则
字典形式识别两个键:
'alias'(必填):别名值本身,可以是字符串、列表或可调用对象;'doc'(可选):一行描述。
其他键为未来功能保留,目前会被忽略。相关实现位于Aliases.__setitem__(xonsh/aliases.py#L616 附近)。
doc 覆盖 docstring
当可调用别名同时设置了'doc'时,'doc'会覆盖函数自身的__doc__——适合在补全中显示简短摘要、在源码中保留详细 docstring:
@ def _bar(): """Long, detailed description of bar...""" echo bar @ aliases['bar'] = {'alias': _bar, 'doc': 'Short summary'} @ ba<TAB> bar Short summary重新赋值会清除旧描述
不带'doc'重新赋值同名别名,会清除之前的描述,避免描述"粘"在同一个名字下不同的值上:
aliases['qwe'] = 'ls -la' # 之前的 'List files' 描述被清除显示控制
默认情况下,只有别名带有 docstring(或显式'doc')时才在下拉框中显示描述。对于非别名命令,若要同时显示其二进制路径,设置:
$CMD_COMPLETIONS_SHOW_DESC = True别名解析机制
所有别名(无论内建还是用户定义)最终都经过Aliases.eval_alias()(xonsh/aliases.py#L406)递归求值:它会不断取最左 token 展开,若它也是别名则继续展开(如l=ls -CF、ls=ls --color=auto的链式展开),遇到可调用别名则"部分应用"剩余参数;同时用seen_tokens集合防止egrep=egrep --color=auto这类自引用别名陷入死循环。
九、参见
- docs/callable_aliases.rst:深入编写可调用别名;
- docs/subprocess.rst:子进程运算符与捕获模式;
- docs/xonshrc.rst:在 RC 文件中定义别名。
- 开发工具
【免费下载链接】xonsh
🐚 Python-powered shell. Full-featured, cross-platform and AI-friendly.
相关推荐
告别冗长命令:downkyi命令行参数别名完全指南
告别冗长命令:downkyi命令行参数别名完全指南 你是否还在为记住 downkyi quality 8K download all output dir /v
WingetUI命令行别名:为常用命令创建简短别名的技巧
WingetUI命令行别名:为常用命令创建简短别名的技巧 你是否经常在使用WingetUI时输入冗长的命令?本文将教你如何为常用命令创建简短别名,大幅提升操作效
桌面应用开发工具跨平台告别重复输入:notepad--命令别名设置完全指南
告别重复输入:notepad 命令别名设置完全指南 为什么需要命令别名? 你是否还在为频繁输入冗长命令而烦恼?在日常文本编辑工作中,重复输入复杂命令不仅浪费时间
桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考