Как разобрать переменное количество аргументов командной строки в кавычках в eval?

#bash #shell #arguments #parameter-passing #eval

#bash #оболочка #аргументы #передача параметров #eval

Вопрос:

Я получил этот простой скрипт:

 #!/usr/bin/env bash
eval "${@:2}"

while [ true ]
do
    FocusApp=`xdotool getwindowfocus getwindowname`

    if [[ "$FocusApp" == *"$1"* ]];
    then
        wmctrl -ir $(xdotool getactivewindow) -b add,maximized_vert,maximized_horz
        break
    fi
done
  

Я запускаю это следующим образом:

 $ ./maximize.sh "Sublime Text" /usr/bin/subl -n "./My File With Spaces in the Name"
  

Но когда я запускаю его, Sublime Text пытается открыть файл с именем My , другой с именем File и т.д. Если я заменю eval "${@:2}" на:

 eval ""$2" "$3" "$4" "$5" "$6" "$7" "$8""
  

Затем Sublime Text корректно открывает файл "./My File With Spaces in the Name" . Как заставить eval правильно понимать все кавычки аргументов с переменным количеством аргументов командной строки, т.е. без жесткого кодирования ""$2" "$3" "$4" ..." ?

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

1. Почему eval вообще? О чем не: "$2" "${@:3}" ?

2. Или даже просто "${@:2}" — вам не нужно специально извлекать 2 доллара

Ответ №1:

Проще просто оставить eval в стороне от этого:

 #!/usr/bin/env bash
"${@:2}"
  

Пример:

 $ ./myscript "Demo" 'printf' 'This is one argument: %sn' 'One long arg' 'Another, with * and such'
This is one argument: One long arg
This is one argument: Another, with * and such