Cmdline Bash Переменная странность - PullRequest
1 голос
/ 31 января 2010

Я хочу установить псевдоним так:

alias hi='TEST=ok echo $TEST'

Однако, похоже, он не работает надежно.

Я начинаю с:

unalias hi
unset TEST

Тогда:

$ alias hi="TEST=ok echo $TEST"
$ hi
$ 

Это на MacOSX:

$ bash --version
GNU bash, version 3.2.17(1)-release (i386-apple-darwin9.0)
Copyright (C) 2005 Free Software Foundation, Inc.

Ответы [ 3 ]

2 голосов
/ 31 января 2010

Проблема не имеет ничего общего с псевдонимами. Просто работает

$ TEST=ok echo $TEST

$

ничего не выводит (кроме новой строки), так как $ TEST раскрывается оболочкой до запуска команды echo.

В этом утверждении происходит три вещи в следующем порядке:

  1. $TEST расширен
  2. TEST назначен 'ok'
  3. echo выполняется (с TEST = ok в его среде)

Если поставить точку с запятой между присваиванием и командой echo, как предложено ghostdog74 (TEST=ok ; echo $TEST), назначение будет отдельной командой оболочки, выполняемой перед командой echo. Затем оболочка может развернуть $TEST во второй команде, поскольку она уже установлена.

1 голос
/ 31 января 2010

вы забыли точку с запятой

alias hi='TEST=ok ;echo $TEST'

0 голосов
/ 31 января 2010

Для полноты:

$ echo 'echo $TEST'>echotest
$ unset $TEST
$ TEST=ok . ./echotest
ok
$ chmod u+x echotest
$ TEST=ok ./echotest
ok
$ echo $TEST
$

В этом случае настройка TEST=ok изменяет среду скрипта echotest, которая не расширяет $TEST внутри него до тех пор, пока он не будет запущен.

...