Сценарий выполнения вызова от удара имеет проблему с аргументами

Прямо сейчас я отвечаю на это со своим ноутбуком, подключенным к монитору. Иметь мой рабочий стол расширилось, я использую xrandr и его графический интерфейс ARandR, они оба работающие вполне прилично.

Действительно, у меня есть сценарий, который я выполняю каждый раз, когда я регистрируюсь к своему ноутбуку, присоединяющему экран к нему:

#!/bin/sh
xrandr --output LVDS1 --mode 1280x800 --pos 0x0 --rotate normal --output VGA1 --mode 1440x900 --pos 1280x0 --rotate normal --output HDMI1 --off

Для понимания этого в первую очередь, необходимо видеть, что это ссылается три outputs: LVDS1, который является экраном ноутбука; VGA1, который является моим внешним монитором; и HDMI1, который отключен (опция --off прямо после него), потому что у меня нет монитора присоединенным к тому порту.

Можно получить список выводов, доступных с:

xrandr -q

После каждого output некоторые параметры, которые устанавливают определенные функции их:

  • mode: устанавливает разрешение вывода.
  • pos: который устанавливает положение вывода относительно верхнего левого угла составленного рабочего стола.
  • rotate: который устанавливает вращение, Вы хотите для вывода.

У меня есть графический адаптер Intel. В случае Nvidia у них есть приложение для выбора TwinView, например.

4
29.01.2012, 01:36
1 ответ

Ваше заключение в кавычки является неправильным. Когда Вы пишете $CMD без кавычек, значения $CMD разбит в “слова” в каждом пробельном ¹ последовательности (слова могут содержать любой непробельный символ включая пунктуацию), и затем каждое слово подвергается globbing (т.е. подстановочное расширение). Обратите внимание что кавычки в значении CMD, в частности, являются нетронутыми: кавычки имеют значение в синтаксисе сценариев оболочки, но не в подстановке переменных. После этого первое слово становится названием команды для выполнения, и последующие слова являются аргументами команды.

В Вашем примере, принимая $KEYNAME somekeyname и $HZID somehzid, затем команда и аргументы:

./dnscurl.pl
--keyname
$KEYNAME
--
-X
POST
-H
"Content-Type:
text/xml;
charset=UTF-8"
--upload-file
/tmp/file.xml
https://route53.amazonaws.com/2010-10-01/hostedzone/somehzid/rrset

Отметьте это text/xml; появляется как первый аргумент неопции; ясно сценарий Perl передает тот аргумент curl. -- в списке аргументов не связано с Вашей проблемой.

Нет никакого способа наполнить командную строку в переменную. (Простая) переменная является неправильным инструментом для который: это содержит строку, но командная строка является списком строк (команда и ее аргументы). Можно наполнить название команды и его аргумент в переменную типа массив:

CMD=(./dnscurl.pl --keyname "$KEYNAME"  --
     -X POST -H "Content-Type: text/xml; charset=UTF-8"
     --upload-file /tmp/file.xml
     "https://route53.amazonaws.com/2010-10-01/hostedzone/$HZID/rrset")
RESULT=$("${CMD[@]}")

Странно выглядящий синтаксис "${CMD[@]}" разворачивает переменную типа массив CMD к списку слов в массиве. Двойные кавычки предотвращают расширение слов в массиве, и [@] необходим по историческим причинам сказать оболочке, что Вы хотите развернуть массив.

Другим способом помнить командную строку или произвольный отрывок оболочки, для более позднего использования, является функция.

cmd () {
    ./dnscurl.pl --keyname "$KEYNAME"  -- \
                 -X POST -H "Content-Type: text/xml; charset=UTF-8" \
                 --upload-file /tmp/file.xml \
                 "https://route53.amazonaws.com/2010-10-01/hostedzone/$HZID/rrset"
}
RESULT=$(cmd)

¹ более точно, согласно значению IFS.

3
27.01.2020, 20:58
  • 1
    Большой ответ, спасибо. Я медленно приближаюсь к компетентности с ударом, и это пойдет польза пути в помощи мне добраться там. –  gview 29.01.2012, 02:05

Теги

Похожие вопросы