Как восстановить контроль над командой с оберткой вокруг нее? - PullRequest
1 голос
/ 08 сентября 2011

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

'MGC_HOME / bin / dmgr_ic'

, которая запускает среду MGC, позволяя просто набирать текст'dmgr_ic', и он проверит некоторые переменные окружения и загрузит программу для вас.Эти обертки полезны, но я хотел бы добавить некоторые параметры к исходной команде, например

MGC_HOME / bin / dmgr_ic -geometry 800x600 + 0 + 0

, чтобы изменить размер плохо размещенного окна,Есть идеи?Я никак не могу прикоснуться к оригинальной обертке и не хочу делать свою собственную копию или версию.Было бы неплохо просто использовать оболочку и каким-то образом захватить соответствующую команду и изменить ее.

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 сентября 2011

Являются ли эти сценарии-обертки очень сложными, или только один вкладыш?

Возможно, можно запустить set -xv, а затем запустить сценарий оболочки с bash -n. Это не выполнит команду, но выведет то, что должно быть выполнено, что я предполагаю, вероятно, последняя строка.

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

Им нужно изменить скрипт-обертку и сделать их более гибкими. Я не возражаю против значений по умолчанию, но позволяю им перезаписываться параметрами командной строки. Например, по умолчанию может быть:

somescript -f foo -b bar -u uff

Однако, если бы я сделал это

somescript -f fufu

Сценарий будет выполнен:

somescript -f fufu -b bar -u uff

Это можно легко сделать, создав оболочку Perl и используя Getopt :: Long . Быстрая и грязная реализация может выглядеть так:

use GetOpt::Long;

# Default Values for Paremters
my $foo = bar
my $bar = foo
my $fubar;           #No default, but valid parameter

GetOptions (
    "foo:s" => \$foo,
    "bar:s  => \$bar,
    "fubar:s" => \$fubar,
) or die qq($USAGE\n);

if (defined $fubar) {
    $fubar = "-fubar $fubar";
}
system qq(mycommand -foo $foo -bar $bar $fubar);

Не на 100% это правильный код, но вы должны понять.

Идея заключается в том, что вам необходимо соблюдать осторожность при использовании дополнительных параметров, таких как -fubar Выше я комбинирую $fubar с параметром и значением, если есть параметр $fubar. Другим вариантом является использование хеша для хранения параметров (возможно с GetOptions), а затем построение параметра командной строки через хеш.

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

1 голос
/ 08 сентября 2011

Опции, включающие модификацию сценария (ов) обертки - идеи достаточно хороши, чтобы их можно было изменить, чтобы изменить их:

  • Добавить параметры, переданные в обертку новым -xargs xyzПараметр оболочки (лучший)

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

  • Добавить параметры, передаваемые в оболочку через ~/.dmgr_ic_rc file

Параметры, включающие НЕ изменение сценариев оболочки:

  • Создание сценария Perl (называемого dmgr_ic), который копирует текущую оболочку в /tmp, изменяет его, добавляя параметр -xargs, и вызывает эту временную копию.НЕ хорошая идея, но работает.

0 голосов
/ 09 сентября 2011

Попробуйте

mv MGC_HOME/bin/dmgr_ic MGC_HOME/bin/dmgr_ic.orig

Затем создайте MGC_HOME / bin / dmgr_ic как текстовый файл, содержащий

#!/bin/sh
MGC_HOME/bin/dmgr_ic.orig -geometry 800x600+0+0

Тогда

chmod 755 MGC_HOME/bin/dmgr_ic
...