Проблема выполнения команды со странными символами в ней - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь вызвать встроенную функцию find, чтобы распечатать содержимое всех текстовых файлов в подпапке my-files. Я понимаю, что есть более простые способы сделать это, но мне нужно, чтобы это работало с exec. Я подозреваю, что exec неправильно обрабатывает кавычки. Мой исходный код выглядит следующим образом:

fullCmd := "find my-files -maxdepth 1 -type f"
cmdParts := strings.Split(fullCmd, " ")
output, _ := exec.Command(cmdParts[0], cmdParts[1:]...).CombinedOutput()
fmt.Println("Output is...")
fmt.Println(string(output))

Это отлично работает и печатает

Output is...
my-files/goodbye.txt
my-files/badfile.java
my-files/hello.txt

Однако, когда я тогда пытаюсь начать добавлять «более странные» символы, он разваливается. Если я изменю первую строку на

fullCmd := "find my-files -maxdepth 1 -type f -iname \"*.txt\""

Ничего не печатается. Хуже, если я изменю строку на:

fullCmd := "find my-files -maxdepth 1 -type f -exec cat {} \\;"

Поиск ошибок с этим stdout:

Output is...
find: -exec: no terminating ";" or "+"

Я думал, что правильно избегаю необходимых персонажей, но, думаю, нет. Любые идеи о том, как заставить команду работать? Для справки, эта команда делает именно то, что я хочу, когда вводится непосредственно в командной строке:

find my-files -maxdepth 1 -type f -iname "*.txt" -exec cat {} \;

1 Ответ

7 голосов
/ 11 июня 2019

Это не имеет ничего общего с "странными" персонажами.\"*.txt\"" указано для вашей оболочки, но вы не запускаете это в своей оболочке.Это должно быть просто *.txt, то есть фактический аргумент, который вы хотите find получить в качестве значения для -iname:

fullCmd := "find my-files -maxdepth 1 -type f -iname *.txt"

Хотя, потому что это не ashell, я бы настоятельно рекомендовал против такого подхода построить подобную оболочке команду как единственную строку и разделить на пробелы;Во-первых, просто предоставьте аргументы в виде массива, чтобы избежать путаницы.

...