【问题标题】:Linux Shell Programming cp commandLinux Shell 编程 cp 命令
【发布时间】:2015-12-14 19:26:53
【问题描述】:

我正在 linux 上编写一个简单的 shell 程序。我已经在我的 shell 中实现了用户给出的许多命令。但我不知道如何给出命令来编写这个命令。我的意思是当用户给出一个简单的命令时,即ls or date我只是在我的shell中写systtem("ls")。我将字符串的值(由用户提供)与 ls 进行比较,如果为真则实施。例如

string s;
cin>>s;
if(s=="ls")
 system("ls");

现在如果用户说cp file1.cpp file2.cpp 那我该怎么办? 提前致谢。

【问题讨论】:

  • 您需要解析命令中给出的每个值以检查它们的有效性。例如,在给出cp 命令时,确保有两个文件,并检查它们是否有文件扩展名等。
  • @m_callens 对不起,我听不懂你说什么?我只是一个初学者,对伪代码有一点帮助,或者一些链接会被应用。
  • 你总是可以跳过验证,让终端吐出错误。
  • @ShaniMughal 你的程序是做什么的?您基本上可以捕捉用户输入的第一个单词,以“猜测”用户给出的命令。我说“猜测”,因为这个词可能是别名、函数、重定向……还有你将如何处理管道?
  • @m_callens 我如何在system() 命令中写入值?它只需要一个双引号中的字符串。

标签: c++ linux shell


【解决方案1】:

system() 只是一个接受const char* 参数的函数。您不必将文字传递给它,任何 char*(以 nul 结尾的 c 样式字符串)都可以。

如果只想将一行用户输入传递给 shell,你可以将其读入string,然后使用string::c_str() 将其传递给system()

std::string input;
std::getline(std::cin, input);
system(input.c_str());

【讨论】:

    【解决方案2】:

    我不确定这是否是您想要的,但您可以使用 sprintf

    int sprintf ( char * str, const char * format, ... );
    

    基本上在你的情况下:

    string f1,f2;
    cin >> s >> f1 >> f2;
    if(s=="cp")
    {
        sprintf(ret,"cp %s %s",f1,f2);
        system(ret);
    }
    

    当然,在进行 sprintf 之前,您会进行所需的验证

    【讨论】: