#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