gpt4 book ai didi

C Bash Shell 重定向

转载 作者:行者123 更新时间:2023-11-30 16:57:07 25 4
gpt4 key购买 nike

我是 C 编程新手。我正在尝试在我的程序中实现重定向功能。

我已经在这段代码上工作了一段时间,并且非常感谢一些新的观点。

正如我之前所说,我正在努力添加 bash 具有的重定向功能(例如:pwd > output.txt),代码能够处理大部分基本功能,我已经评论了如何将其组合在一起。

我的问题:

  1. 创建一个接受用户命令进行重定向的函数是不是很聪明?我的代码非常脏(我希望有任何关于清洁的提示)
  2. 我假设我将再次使用 strcmp,在一个控件中搜索“<”,然后在另一个控件中搜索“>”,但我不确定应该将搜索放在哪里(如果我留在main,不创建新函数)。

我目前正在碰壁,也许是因为我已经这样做了一整天,这是我的 shell 现在的样子,谢谢你们。

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

/* C based bash shell, working on creating redirects..*/
int main(int argc, char* argv[]){
char cmnd[1024];
char* str1[100];
const char* str2 = "exit"; //string to compare for exit
char* fullpath= "/bin/";//path set to bin
char progpath[100];//complete file path
const char* home = getenv("HOME"); //get home enviornment
char directory[1024];
char fileD[100];
char* str3[100];
if(argc == 1)
{
while(1){

printf("dollar sign: ");

if(!fgets(cmnd, 1024, stdin))
break;
size_t length = strlen(cmnd);
if (cmnd[length - 1] == '\n')
cmnd[length - 1] = '\0';

if(strcmp(cmnd, str2)==0){ //check if cmnd is exit
break;
}

char *tkn; //split cmnd into separate strings
tkn = strtok(cmnd," ");
int i=0;
while(tkn!=NULL){//until null is reached, break into tkns
str1[i]=tkn;
tkn = strtok(NULL," ");
i++;
}
str1[i]=NULL; //last set to Null (EXECVP req)
strcpy(progpath, fullpath); //copy string /bin/ to file path, for running
if(strcmp(cmnd, "help")==0)//help line
{
printf("Enter bash cmnds, or 'exit' to exit\n");//if help is issued, ignore the rest
} else if(strcmp(cmnd, "today")==0){//today doesn't exist, but "date" does. Replace today with date.
strcat(progpath, "date");
}else{
strcat(progpath, str1[0]);//add program to path
}

for(i=0; i<strlen(progpath); i++){//delete newcmnd
if(progpath[i]=='\n'){
progpath[i]='\0';
}
}//start fork
int pid= fork();

if(pid==0){//if child
if(strcmp(str1[0],"cd") == 0)
{
int tempCmnd;
if(!str1[1])
{

tempCmnd = chdir(getenv("HOME"));//for moving home
if(tempCmnd == -1)
{
fprintf(stderr, "CD err.\n");
}else{
getcwd(directory, sizeof(directory));
printf("Currently in %s\n", directory);
}
}else{

tempCmnd = chdir(str1[1]);
if(tempCmnd == -1)
{
fprintf(stderr, "CD err.\n");
}else{
getcwd(directory, sizeof(directory));
printf("Move Success : %s\n", directory);//pwd
}
}
break;//(end child proc)
}else{
execvp(progpath,str1);
if(strcmp(cmnd, "help")==0)//ignore the error if help is issued, otherwise standard error
{
//printf("Test")
}
else{fprintf(stderr, "Child process could not do execvp\n");}
break;}
}
else{//Parent control
wait(NULL);
}
}
}else{

FILE * pfile;
pfile = fopen(argv[1], "r" );
if ( pfile == 0 )
{
printf( "Opening file failed\n" );
}else{
fgets(fileD, 100, pfile);//fget file into string
fclose(pfile);//close

char *tkn; //split pCommand by strtok
tkn = strtok(fileD," ");
int i=0;
while(tkn!=NULL){//until null is reached, break into tkns
str1[i]=tkn;
tkn = strtok(NULL," ");
i++;
}
str1[i]=NULL; //end set to null
strcpy(progpath, fullpath); //copy full path to program path
strcat(progpath, str1[0]);//add cmnd to the path
for(i=0; i<strlen(progpath); i++){// iterate to delete newcmnd
if(progpath[i]=='\n'){
progpath[i]='\0';
}
}
execvp(progpath,str1); //execvp with new string
}
}
}

最佳答案

是的,将其组合在一起的一种方法是使用 strcmp()查找字符< 。您可以通过使用 strtok() 分割字符串来获取文件名或strchr() 。然后将文件的内容作为参数传递给命令。

重定向输出:

打开文件描述符,并使用dup2(fd, 1)写入打开的文件描述符。

或者,使用popen()执行命令,并将输出写入文件。

关于C Bash Shell 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39683621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com