如何制作';cd&x27;从我自己的自定义shell命令工作?

如何制作';cd&x27;从我自己的自定义shell命令工作?,c,linux,shell,system-calls,C,Linux,Shell,System Calls,我目前正在做UNIX(LINUX)编程的家庭作业。 我被指派构建自己的定制shell,所有常用的linux命令和定制程序都可以工作 我还创建了my_ls,my_cp,my_rm,my_cd,以检查linux命令和我自己的命令是否都有效 下面是一个简单的故事 /myOwnShell//运行我自己的shell 主页/测试文件夹>>ls.//Shell提示符 a、 out helloWorld.txt myOwnShell.c myOwnShell//打印ls命令的结果 主页/测试/文件夹>>我的/运

我目前正在做UNIX(LINUX)编程的家庭作业。 我被指派构建自己的定制shell,所有常用的linux命令和定制程序都可以工作

我还创建了
my_ls
my_cp
my_rm
my_cd
,以检查linux命令和我自己的命令是否都有效

下面是一个简单的故事

/myOwnShell//运行我自己的shell
主页/测试文件夹>>ls.//Shell提示符
a、 out helloWorld.txt myOwnShell.c myOwnShell//打印ls命令的结果
主页/测试/文件夹>>我的/运行我自己的ls命令程序
a、 out helloWorld.txt myOwnShell.c myOwnShell
到目前为止,所有的linux命令(在/bin/中)和我自己的命令(在home//bin/中)都有效。 但当我键入
cd
my_cd
时,它会有所不同,这会改变当前的cwd

home/testFolder>>cd ..
Fail to run program // Error message from exec function failure
home/testFolder>>my_cd ..
// No message but also cwd is not changed
home/testFolder>>   // Prompt from same folder
下面是myShell程序的一些伪源代码 (我无法复制/粘贴我的源,因为它位于大学服务器中,传输协议被阻止)

intmain(){
char**res;//通过标记存储命令
而(1){
printf(“%s>>”,cwd);
get(in);//get命令
// 
//res=[“ls”,“/文件夹”,NULL]>
pid=fork();
如果(pid==0){//child
如果(execvp(res[0],res)=-1){//运行'ls'命令
printf(“无法运行程序”);
退出(0);//退出子进程
}
}否则{//Parent,在fork失败的情况下省略
等待(0);
//省略退出状态检查代码
}
}
返回0;
}
Command
cd
是linux内置的命令, Command
my_cd
是我自己的程序,可以更改它的cwd

我知道更改子进程的cwd不会影响父进程,这就是为什么“cd”不会更改shell的cwd。我发现
cd
命令不在
/bin/
中,所以我猜
cd
是在linux shell中编码的

我怎样才能让它工作

  • 对于linux
    cd
  • 对于我自己的
    my_cd
    ——我没有它的源代码,只有程序。这是我的教授寄来的
  • 我的猜测是
    cd
    无法实现,除非它是在shell本身中编码的。但教授给了我这个家庭作业,这可能意味着这是可能的


    有什么想法吗?

    研究一些现有开源shell的源代码,例如,或,然后查看。另请阅读
    cd
    命令是一个特殊的内置命令-它不执行外部二进制文件(即使POSIX系统上存在
    /bin/cd
    /usr/bin/cd
    中的一个)。如果您真的在编写自己的shell,那么当前目录只是它的一个内部状态。因此,您的
    cd
    只需对其进行更改即可。我收回它-
    cd
    不是POSIX中的特殊内置项-;它只是一个实用工具()。但是,它通常是内置的,因为它必须影响当前进程的当前目录,而执行的命令不能这样做。@JonathanLeffler这是否意味着cd是驻留在/bin中的程序?我在/bin中找不到“cd”程序。
    int main() {
       char** res; // store command by tokening
       while (1) {
         printf("%s>>", cwd);
         gets(in); // get command
         // <Some codes that split `in` by space and store it into res>
         // <If cmd is "ls ./folder" -> res = ["ls", "./folder", NULL]>
          
          pid = fork();
          if (pid == 0) { // child
            if (execvp(res[0], res) == -1) { // Run 'ls' command
              printf("Fail to run program");
              exit(0); // Exit child process
            }
          } else { // Parent, I omit in case of fork failure
             wait(0);
             // Omit exit status checking code
          }
       }
      return 0;
    }