Linux: Как я могу делегировать экзотические аргументы командной строки, используя скрипт? - PullRequest
1 голос
/ 19 декабря 2009

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

#!/bin/sh
someProgam $@

Но при передаче экзотических аргументов (пустых, неэкранированных, в кавычках, ...) это не получается.

Например: без скрипта-оболочки someProgram "1 2" 3 приводит к аргументам
[1 2] и [3].
Но при вызове из скрипта я получаю [1], [2], [3].

Подтяжки предназначены только для визуализации.

ПРИМЕЧАНИЕ. Это Java-программа, которая называется. Но я думаю, что это не имеет значения.

Ответы [ 2 ]

6 голосов
/ 19 декабря 2009
#!/bin/sh
someProgram "$@"

См. Также документы bash по специальным параметрам .

BTW1, "$@" не относится к bash. Вероятно, вы можете положиться на "$@" в кроссплатформенных sh сценариях, которые можно запускать где угодно.

Кстати, если это последняя строка в этом скрипте, вы можете сохранить в своей операционной системе несколько байтов и запись в таблице процессов, изменив строку на что-то вроде

exec someProgram "$@"
4 голосов
/ 19 декабря 2009

для дополнения ответа ndim: поведение "$@" не относится к bash. это предписано Спецификацией Single Unix:

2.2.3 Двойные кавычки

Заключение символов в двойные кавычки ("") должно сохранять буквальное значение всех символов в двойных кавычках, за исключением символов доллара, обратной кавычки и обратной косой черты, следующим образом:

Параметр '@' имеет особое значение в двойных кавычках и описан в Специальные параметры .

2.5.2 Специальные параметры

Ниже перечислены специальные параметры и значения, до которых они будут расширяться. В списке указаны только значения специальных параметров; см. Расширения слов для получения подробной информации обо всех этапах расширения слов.

@

Расширяется до позиционных параметров, начиная с единицы. Когда расширение происходит в двойных кавычках, и когда выполняется разделение поля (см. Разделение поля ), каждый позиционный параметр должен раскрываться как отдельное поле, при условии, что расширение первого параметра все еще должно быть соединяется с начальной частью исходного слова (при условии, что расширенный параметр был встроен в слово), а расширение последнего параметра все еще должно соединяться с последней частью исходного слова. Если позиционные параметры отсутствуют, расширение «@» будет генерировать нулевые поля, даже если «@» заключено в двойные кавычки.

...