使用echo在C中写入文件时如何创建新行

Alp*_*aya 5 c linux system file echo

嗨我正在试图获取具有系统功能的文件夹中的文件数据这是代码

char path[100],command[120];
    scanf("%s",&path);

sprintf(command,"echo $(ls %s) > something.txt",path);
            system(command);
Run Code Online (Sandbox Code Playgroud)

但是当我查看something.txt时,没有新行.这是输出,全部在一行上省略了许多文件名:

acpi adjtime adobe apparmor.d arch-release asound.conf ati at-spi2 avahi bash.bash_logout ... wpa_supplicant X11 xdg xinetd.d xml yaourtrc
Run Code Online (Sandbox Code Playgroud)

我确实尝试-e -E -n过echo的选项,但它没有用.如何在每个文件后创建一个新行?

Ole*_*nov 6

你不应该使用echo.做吧

sprintf(command,"ls %s > something.txt",path);
system(command);
Run Code Online (Sandbox Code Playgroud)

使用echo它时,将所有命令行参数逐个输出到stdout,用空格字符分隔.换行符(ls作为命令的输出)用作参数分隔符,就像空格一样.


Jon*_*ler 2

有一条新线路,这是意料之中的。该echo命令将其所有参数打印在一行上,并用空格分隔,这就是您看到的输出。

您需要执行以下结果:

echo "$(ls %s)"
Run Code Online (Sandbox Code Playgroud)

保留ls输出中的换行符。请参阅捕获多行输出到 Bash 变量

使用:

snprintf(command, sizeof(command), "echo \"$(ls %s)\" > something.txt", path);`
Run Code Online (Sandbox Code Playgroud)

当然,这echo是多余的;最好简单地运行:

ls %s
Run Code Online (Sandbox Code Playgroud)

因此:

snprintf(command, sizeof(command), "ls %s > something.txt", path);
Run Code Online (Sandbox Code Playgroud)

如果保留回显,您应该担心格式字符串中有超过 20 个额外字符,因此 120 如果不是 140,也应该更像 130。

您还应该使用scanf("%99s", path)(无 & 符号;添加长度限制),并最好检查它是否有效 ( if (scanf(...) == 1) { ... OK ... })。