расширение фигурной скобки в программе c с помощью системной функции

Я попробовал команду

cat tmp/file{1..3} > newFile

и работает идеально

Но когда я компилирую и выполняю следующую программу c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main() {
   char command[40];
   int num_of_points = 3;
   sprintf(command,"cat tmp/file{1..%d} > file.Ver",num_of_points);
   system(command);
}

сообщение

cat: tmp/file{1..3}: No such file or directory

появляется

Похоже, система не делает расширение скобки


person chris    schedule 27.11.2017    source источник
comment
попробуйте system("echo $SHELL\n"), чтобы увидеть, вызывает ли system() bash.   -  person 眠りネロク    schedule 27.11.2017
comment
Причина в том, что system() вызывает /bin/sh -c, что, как вы заметили, не приводит к раскрытию скобок. Вместо этого вызовите bash -c с помощью system() или создайте полностью переносимое решение только для C. Твой выбор.   -  person MechMK1    schedule 27.11.2017


Ответы (2)


Похоже, система не делает расширение скобки

Проблема в оболочке, вызываемой system(), это не Bash, а другая оболочка, которая не поддерживает раскрытие фигурных скобок.


Вы по-прежнему можете вызывать bash с опцией -c, чтобы использовать bash с system(). Например:

system("bash -c 'echo The shell is: $SHELL'")

Сама bash будет работать поверх другой оболочки (т. е. оболочка system() вызывается), но команда echo определенно будет выполняться в Bash.

Применяя тот же принцип в своем коде:

sprintf(command,"bash -c 'cat tmp/file{1..%d} > file.Ver'",num_of_points);

создаст правильную строку command, которую нужно передать в system(), чтобы команда cat tmp/file{1..%d} > file.Ver выполнялась в Bash и выполнялось раскрытие скобок.

person 眠りネロク    schedule 27.11.2017

На страницах руководства для команды system говорится: «system() выполняет команду, указанную в команде, путем вызова команды /bin/sh -c».

Таким образом, он не будет выполнять расширение скобок, подобное bash. Я предлагаю вам построить строку файлов в cat вместе в цикле, но следите за тем, чтобы не переполнить буфер command.

person Kyrill    schedule 27.11.2017
comment
Спасибо, я понимаю, что системный вызов sh вместо bash. я не знал, что sh не поддерживает расширение скобок. - person chris; 27.11.2017