Назад | Перейти на главную страницу

Изменить порядок расширений (bash)

Мне нужно расширение параметра после подстановки команды.

GNU bash, версия 4.1.5 (1)

$ foo() { echo \$a; }
$ a=5
$ echo $(foo)
$a

Является ли это возможным?

тест:

#!/bin/bash

echo $a

бегать:

a=5
echo $(./test)

если тест:

#!/bin/bash

echo \$a

бегать:

echo $(./test)
$a

Не работай (

... Какой?

$ foo() { echo $a; }
$ a=42
$ echo $(foo)
42

Порядок не может быть изменен без изменения исходного кода.

Вы можете использовать eval:

eval echo $(foo)

человек bash:

   The order of expansions is: brace expansion, tilde  expansion,  parame‐
   ter,  variable  and arithmetic expansion and command substitution (done
   in a left-to-right fashion), word splitting, and pathname expansion.
echo `eval foo`

Это то, что вы хотите?

Функция:

$ a=5
$ foo() { echo \$a; }
$ foo
$a
$ eval echo $(foo)
5

Сценарий:

#!/bin/bash
echo $a

Бегать:

$ a=5
$ ./test
$ export a
$ ./test
5

Новый сценарий:

#!/bin/bash
echo 'echo $a'

Бегать:

$ a=5
$ ./test
echo $a
$ eval $(./test)
5

Пример Python:

$ a=5
$ python -c 'print "echo $a"'
echo $a
$ eval $(python -c 'print "echo $a"')

Другой пример Python:

$ a=5
$ python -c 'print "a=42"'
a=42
$ echo $a
5
$ declare $(python -c 'print "a=42"')
$ echo $a
42