在Parent Shell中执行内置命令的方法
July 25, 2022
背景 #
最近在为 大仓项目(Monorepo) 制作一个脚手架,其中构思了一个自动替用户切换工作路径的工具(代码是通过模板初始化的,在结构上基本一致,但是代码文件较深,想要在terminal去和文件交互时,只能使用 cd
命令,费时费力),因此我期望一个小工具,能比较方便的帮我跳转到目标路径。预期的使用效果如下:
这个命令执行后,你可以从当前路径(任意路径)跳转到目标路径,那我就不用记我应该先跳转到根目录再前往目标目录了,少敲击很多次 tab。
PS: 后续计划给这个命令扩展一下历史记录,可以通过筛选匹配历史快速补全命令,提高效率。
chdir没作用? #
这个小工具是通过Go来编写的,我从文档中看到 os.Chdir
这个调用, 因此用它来试试:
// Chdir changes the current working directory to the named directory.
// If there is an error, it will be of type *PathError.
func Chdir(dir string) error
结果我发现没有效果,通过 os.Getwd()
却能看到当前路径已经被改变了。这个切换的需求还没解决,我却产生了几个新的疑问:
cd
命令怎么实现的?chdir
系统调用的使用和原理?
通过执行如下的命令,会发现 cd
命令并不是通过一个独立的可执行文件来实现的,而是内置在 bash 等 shell 程序中,其次通过查阅资料可以发现
大部分Linux发行版都部分符合 POSIX 标准。如果再检索一下shell程序的原理,我们会得出如下的结论:
$ which cd
cd: shell built-in command
shell 程序在执行内建命令时,是通过调用内部的函数的执行。而非内建的命令(如 git / gcc / gdb)都是通过 fork 一个进程来执行;cd 命令是通过 chdir
[IEEE Std 1003.1-1988] 系统调用实现的;chdir
在 <uinstd.h> 头文件中定义;