我正在尝试使用下面的C ++程序创建名为1 2 3 4的文件夹。我可以在 RHEL 中成功实现这一目标。 但是,它在 ubuntu 13.10 中创建了一个名为{1..4}的文件夹。
为什么会这样?谢谢你的帮助!
#include <cstdlib>
int main()
{
std::system("mkdir {1..4}");
}
这是我们产品中CPP单元测试的一部分。是的,这很难看。但是我担心在这种情况下可以做的事情很少。
你是对的。 在RHEL, sh -c'echo {1..4}' 1 2 3 4
在Ubuntu中 sh -c'echo {1..4}' {1..4}
所以我使用下面的程序。有用! #include
int main()
{
std::system("bash -c 'mkdir {1..4}'");
}
默认情况下系统使用sh ....感谢您的回答!
答案 0 :(得分:7)
一些术语:Linux directories中有file systems,而不是“文件夹”(文件夹可能在桌面上直观显示,但这是桌面详细信息)。
您无需使用system(3)(正在运行sh
而不是bash
!)。
并且POSIX sh
不知道{1..4}
表示法,因此{1..4}
字符串将 verbatim 传递给/bin/mkdir
命令(请参阅mkdir(1) } ...)。
运行
sh -c 'echo {1..4}'
测试sh
不理解{1..4}
符号。
(所以这是旧RHEL中的一个错误,其中/bin/sh
可能是/bin/bash
的符号链接,而在Debian和Ubuntu上它是符合Posix的更快且更快{{1}的符号链接})
只需使用mkdir(2)系统调用和代码
即可/bin/dash
我希望您不要创建名为#include <cstdlib>
#include <cstdio>
#include <sys/stat.h>
#include <sys/types.h>
int main() {
for (int i=1; i<=4; i++) {
char buf[8];
snprintf(buf, sizeof(buf), "%d", i);
if (mkdir(buf, 0755))
{ perror("mkdir"); exit(EXIT_FAILURE); };
}
}
的单个目录。它既可能又简单,但味道确实很差。为了您的心理安全,请在目录名称中仅使用字母,数字和下划线1 2 3 4
。
我使用snprintf(3)将int转换为字符缓冲区。使用C++11,您可以使用std::to_string和c_str ...
阅读Advanced Linux Programming ...
使用_
系统调用而不是通过mkdir(2)
调用的命令有几个重要优点:
system(3)
这样的/bin/sh -c
system(3)
shell应该这样做。fork
- ed,所以当你达到极限时,你的程序仍会运行(参见fork(2) ...)mkdir(2)
失败,你可以(并且应该)很好地处理失败。请参阅setrlimit(2)和errno(3) ....