Подтвердить что ты не робот

Невозможно использовать параметр bash -c с аргументами после строки -c

Страница пользователя для bash говорит, что касается опции -c:

-c string
Если присутствует опция -c, тогда команды считываются из string. Если есть аргументы после строки, они назначаются позиционные параметры, начиная с $0.

Поэтому, учитывая это описание, я думаю, что что-то вроде этого должно работать:

bash -c "echo arg 0: $0, arg 1: $1" arg1

но вывод просто показывает следующее, поэтому он выглядит так, как аргументы после строки -c не назначаются позиционным параметрам.

arg 0: -bash, arg 1:

Я запускаю довольно древний bash (на Fedora 4):

[root @dd42 trunk] # bash --version
GNU bash, версия 3.00.16 (1) -release (i386-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.

То, что я действительно пытаюсь сделать здесь, - это выполнить бит оболочки script с аргументами. Я думал, что -c выглядит очень многообещающим, следовательно, проблема выше. Я задавался вопросом об использовании eval, но я не думаю, что могу передать аргументы тому, что следует за eval. Я также открыт для других предложений.

4b9b3361

Ответ 1

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

$ bash -c 'echo arg 0: $0, arg 1: $1' arg1 arg2
arg 0: arg1, arg 1: arg2

Или избегайте переменные в вашей строке с двойными кавычками. Это может зависеть от того, что вы хотите поместить в свой фрагмент кода.

Ответ 2

Потому что '$0' и '$1' в вашей строке заменяется переменной # 0 и # 1 соответственно.

Попробуйте:

bash -c "echo arg 0: \$0, arg 1: \$1" arg0 arg1

В этом коде $ оба из них escape, поэтому база видит его как строку $ и не заменяется.

Результат этой команды:

arg 0: arg0, arg 1: arg1

Надеюсь, что это поможет.

Ответ 3

Добавьте обратную косую черту к $0 (т.е. \$0), в противном случае ваша текущая оболочка выйдет из $0 в имя оболочки до того, как она даже попадет в подоболочку.

Ответ 4

Мартин прав насчет интерполяции: вам нужно использовать одинарные кавычки. Но учтите, что если вы пытаетесь передать аргументы команде, которая выполняется в строке, вам необходимо направить их явно. Например, если у вас есть script foo.sh like:

#!/bin/bash
echo 0:$0
echo 1:$1
echo 2:$2

Затем вы должны вызвать его так::

$ bash -c './foo.sh ${1+"[email protected]"}' foo "bar baz"
0:./foo.sh
1:bar baz
2:

Или, как правило, bash -c '${0} ${1+"[email protected]"}' <command> [argument]...

Не похоже на это:

$ bash -c ./foo.sh foo "bar baz"
0:./foo.sh
1:
2:

Не нравится это:

$ bash -c './foo.sh [email protected]' foo "bar baz"
0:./foo.sh
1:bar
2:baz

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