V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
zhongshaohua
V2EX  ›  Linux

怎么在程序中将 str 中的内容通过 shell 命令 echo 写到指定文件?

  •  
  •   zhongshaohua · 2016-07-17 20:06:02 +08:00 · 3522 次点击
    这是一个创建于 3070 天前的主题,其中的信息可能已经有所发展或是发生改变。
    21 条回复    2016-07-20 21:43:10 +08:00
    zonghua
        1
    zonghua  
       2016-07-17 20:10:00 +08:00
    echo $str > yours.txt
    zhongshaohua
        2
    zhongshaohua  
    OP
       2016-07-17 20:23:40 +08:00
    @zonghua fp =popen("echo $input >/proc/echo_config","w"); 这样写有问题吗?
    fuge
        3
    fuge  
       2016-07-17 20:46:04 +08:00
    @zhongshaohua python ? Popen? or open? ,,,,,,,,,,,,,,,,
    zhongshaohua
        4
    zhongshaohua  
    OP
       2016-07-17 20:52:09 +08:00
    @fuge c 语言
    zhongshaohua
        5
    zhongshaohua  
    OP
       2016-07-17 21:02:07 +08:00
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>

    int main(){
    pid_t childpid;
    if ((childpid=fork()) == 0){
    char * execvp_str[] = {"echo", "executed by execvp",">", "~/abc",NULL};

    if (execvp("echo",execvp_str) <0 )
    perror("error on exec");
    return 0;
    }else{
    //parent process
    wait(&childpid);
    printf("execvp done\n\n");
    }
    }

    这样为什么也写不进??
    changshu
        6
    changshu  
       2016-07-17 21:14:42 +08:00
    2L 的问题在于 /proc 下面的是 proc fs, 不存在的 proc 文件即便 root 通过 IO 写入也创建不了.
    5L 的问题在于 exec 系列函数不执行 shell 解释器, >和~这种 shell 语法认不得, 全当字符串输出了.
    zhongshaohua
        7
    zhongshaohua  
    OP
       2016-07-17 21:26:19 +08:00
    @changshu 2L 方法如果在内核先创建了文件 这样是不是就应该能写入? 5L 这种方法正确的应该怎么写? 求老司机发车
    8bit
        8
    8bit  
       2016-07-17 21:28:40 +08:00
    试试管道
    zhongshaohua
        9
    zhongshaohua  
    OP
       2016-07-17 21:38:17 +08:00
    @8bit 2L 中的方法管道可以 但是内容在数组 str 里面 不知道怎么 echo 过去
    chzyer
        10
    chzyer  
       2016-07-17 21:53:03 +08:00
    bash -c "echo $input >/proc/echo_config", 通过调用 bash 去解析 bash 脚本,接下来你想 popen 还是 exec 就随意了
    zhongshaohua
        11
    zhongshaohua  
    OP
       2016-07-17 22:38:30 +08:00
    @chzyer 还是没理解
    zhongshaohua
        12
    zhongshaohua  
    OP
       2016-07-17 22:41:11 +08:00
    @chzyer fp = popen("bash -c 'echo $input > ~/abc'","w"); 是这样吗?这样也还是写不进去啊
    8bit
        13
    8bit  
       2016-07-17 23:09:14 +08:00 via Android
    突然想起来,直接在 shell 中调用你的程序,参数可以通过 main 的入口传入
    chzyer
        14
    chzyer  
       2016-07-17 23:10:57 +08:00
    @zhongshaohua 你要先确保 $input 不是空啊在这个环境里面。我不知道你这个 $input 是怎么获得的。
    neoblackcap
        15
    neoblackcap  
       2016-07-18 02:11:52 +08:00
    为什么要这么做?记得是有系统调用获取环境变量的啊,直接写文件不就好了吗?
    msg7086
        16
    msg7086  
       2016-07-18 03:01:06 +08:00
    1. 你没说清楚你需要用 C 语言来做。
    2. 你说的是用 Shell 写入,但是用 C 语言写入的话不需要过 Shell 。
    3. 你应该先学习下什么叫变量,什么叫字符串,如何拼接字符串。
    ncisoft
        17
    ncisoft  
       2016-07-18 03:49:12 +08:00 via Android
    友情提示: fprintf fopen
    zhaoxiting1997
        18
    zhaoxiting1997  
       2016-07-18 09:53:11 +08:00 via Android
    在 c 语言下有多种输出文件的方法,用 shell 命令不是一种好的选择:既不能在 windows 或者其他系统下用,如果输出是用户可编辑的又存在着构造特定字符串执行任意代码的风险。
    changshu
        19
    changshu  
       2016-07-18 13:23:42 +08:00
    @zhongshaohua 有 proc 文件的话没问题, 直接 2L 那方法就行, 没必要改 5L 了, 就你现在这需求折腾 5L 也就是实现一个简易版的 system 或者 popen
    jixiangqd
        20
    jixiangqd  
       2016-07-18 17:18:31 +08:00
    为何要这么搞?直接开文件写不行?
    zhongshaohua
        21
    zhongshaohua  
    OP
       2016-07-20 21:43:10 +08:00
    @jixiangqd 最后是 open write
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   876 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 20:36 · PVG 04:36 · LAX 12:36 · JFK 15:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.