Это вопрос о том, как Bash обрабатывает группировку слов и расширение переменных. Я продемонстрирую вопрос на очень конкретном примере:
bash$ git log --format=fuller --date=format:"%Y-%m-%d T%H" # This works.
# Sample output:
commit aba22155684
Author: SerMetAla
AuthorDate: 2018-04-12 T23
Commit: SerMetAla
CommitDate: 2018-04-12 T23
Here is the commit message.
Я бы хотел, чтобы это сработало:
bash$ git log "$myformat" # It should print the same stuff.
Я не знаю, как это сделать с помощью одной переменной Bash. Вот рабочий пример с ДВУМЯ переменными:
# Define the two variables:
bash$ mypref="--format=fuller"
bash$ mydate="--date=format:%Y-%m-%d T%H" # Note: No " after the colon.
# Now use it:
bash$ git log "$mypref" "$mydate" # It works.
Проблема в следующем: как мне заставить это работать с одной переменной Bash? Возможно ли это?
Главная проблема:
git log --format=fuller --date=format:"%Y-%m-%d T%H"
| ^ This space is inside one argument.
|
^ This space separates two arguments.
Я хотел бы использовать обычную строковую переменную. Я не хочу использовать переменную массива, я не хочу использовать $'...'
, я не хочу использовать функцию, я не хочу использовать псевдоним. Когда строка неизменяема и когда она не находится в начале команды, кажется, что это должна быть переменная Bash.
Я мог бы очень легко решить это с помощью функции, которая была бы довольно читабельной. Я мог бы решить это с помощью других трюков Bash, но это было бы ужасно. Я хочу использовать строковую переменную.
решение1
Я не хочу использовать переменную массива
Вы отвергаете подходящий инструмент для работы. Ну, вы можете попробовать eval
:
$> foo='a "b c"'
$> printf "%s\n" $foo
a
"b
c"
$> eval printf '"%s\n"' $foo
a
b c
$>
В вашем случае это будет выглядеть так:
myformat='--format=fuller --date=format:"%Y-%m-%d T%H"'
eval git log $myformat
решение2
Это распространенный часто задаваемый вопрос.https://mywiki.wooledge.org/BashFAQ/050
Короче говоря, способ решения этой проблемы — поместить аргументы в массив.
myformat=("$mypref" "$mydate")
git log "${myformat[@]}"
В качестве очень грубого решения вы также можете использовать printf
спецификатор формата кавычек:
printf -v myformat '%q %q' "$mypref" "$mydate"
git log $myformat