【问题标题】:How to open file in nano in C如何在C中用nano打开文件
【发布时间】:2014-09-12 22:30:10
【问题描述】:

所以我正在编写一个更像是 shell 的 C 程序,我已经到了需要创建一个命令来在 nano 中打开文件的地步。实际上,我的这个工作非常好,而且一切正常。除了我得到一个 Sh 1. Permission Denied when I open a file。

char filename[4080];
printf("Enter the file you wish to edit: ");
scanf("%s", filename);
char thething[4080];
sprintf(thething, "/usr/local/script/send_it.pl %s",
filename);
system(filename);`

当我运行它时会发生这种情况

pi@raspberrypi ~/JacoShell $ sudo ./shell

JacoShell: /home/pi/JacoShell $nano
Enter the file you wish to edit: /home/pi/JacoShell/test.txt
sh: 1: /home/pi/JacoShell/test.txt: Permission denied

JacoShell: /home/pi/JacoShell $

./shell 被适当地修改了,所以我不知道问题是什么

【问题讨论】:

  • 你正在尝试执行/home/pi/JacoShell/test.txt,而不是nano
  • @lxg,不,我不是。你听说过 JacoShell 吗?那是因为我正在写它。它会提示您输入文件并将该文件名传递给 nano 显示在代码中
  • ...但 system() 被定义为调用 sh,而不是 JacoShell(或 bash,或 ksh,或任何其他不是 sh)。
  • @JacobMisirian 我认为您需要阅读更多关于 system 函数的信息。
  • @JacobMisirian,不正确 -- system() 不直接调用可执行文件;它是通过一个外壳来实现的。如果您想直接调用可执行文件,请阅读 execve() 系列调用的手册——这就是 real shell 所做的。

标签: c linux shell system nano


【解决方案1】:

您可能打算将thething 传递给system(),而不是filename。如所写,您的代码不使用 sprintf() 的结果。

不过,在您这样做之前,您可能需要考虑如果您的文件名包含空格或其他特殊字符会发生什么……

【讨论】:

  • 空格?这并不可怕。如果你的文件是/tmp/$(rm -rf /)/hello,那就更有趣了。 :)
  • ...也就是说,鼓励正在编写 shell 的人使用system() 有点不幸——因为system() 本身调用了一个 shell。
  • sh: 1: /usr/local/script/send_it.pl: 未找到
  • 哦,我明白了,您正在从ancient forum threads 复制代码。该脚本是原始问题的一部分。它在您的系统上不存在。您需要使用适当的命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2014-04-05
  • 1970-01-01
  • 2021-07-15
  • 2010-10-05
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多