передайте аргументы команде в bash

#bash #clang-format

Вопрос:

Я пытаюсь перейти arg к clang-format :

 arg="-style="{BreakBeforeBraces: Attach}""
clang-format -i $arg 'myfile.h'
 

но получил следующую ошибку:

 No such file or directory
Invalid value for -style
 

Однако, если я просто выполню команду, как показано ниже:

 clang-format -i -style="{BreakBeforeBraces: Attach}" 'myfile.h'
 

Это работает совершенно нормально.

Комментарии:

1. Используйте для этого массив или функцию оболочки

2. @anubhava спасибо. не могли бы вы подробнее рассказать о том, почему и как использовать массив / функции оболочки для устранения проблемы, пожалуйста?

Ответ №1:

Вы можете просто создать функцию, подобную этой:

 cfmt() {
   clang-format -i "$@"
}
 

Затем используйте его как:

 cfmt -style="{BreakBeforeBraces: Attach}" myfile.h
 

Другой безопасный способ-хранить аргументы в массиве оболочки:

 arg=('-i' '-style="{BreakBeforeBraces: Attach}"')

# use it as
clang-format "${arg[@]}" 'myfile.h'
 

Комментарии:

1. Мое намерение состоит в том, чтобы передать стиль в формат clang, потому что это может быть другой стиль в другой ситуации. У меня нет проблем с тем, чтобы обернуть их в функцию.

2. Конечно, проверьте мой обновленный ответ

Ответ №2:

Оболочка удаляет двойные кавычки при непосредственном выполнении команды, поэтому нет необходимости указывать их в значении переменной.

Однако вам нужно удвоить значение переменной, чтобы сохранить ее содержимое одним словом:

 arg='-style={BreakBeforeBraces: Attach}'
clang-format -i "$arg" myfile.h
 

Если число аргументов не является фиксированным (включая возможное 0), используйте массив:

 args=('-style={BreakBeforeBraces: Attach}')
clang-format -i "${args[@]}" myfile.h
 

Комментарии:

1. Похоже, что если arg является пустой строкой (в случае, если мне не нужны дополнительные стили, например, arg=»», то использование этого способа выдаст мне ошибку «Нет такого файла или каталога».

2. Если количество аргументов не фиксировано, используйте массив.

3. Блестяще! Спасибо!