Следуйте по
https://stackoverflow.com/questions/1809899/how-can-i-assign-the-output-of-a-function-to-a-variable-using- bash и Как назначить вывод команды переменной?
Я написал
function getos(){
# http://stackoverflow.com/a/27776822/1637673
case "$(uname -s)" in
Darwin)
OS='mac'
;;
Linux)
OS='linux'
;;
CYGWIN*|MINGW32*|MSYS*)
OS='win'
;;
# Add here more strings to compare
# See correspondence table at the bottom of this answer
*)
OS='other'
;;
esac
echo $OS
}
echo $(getos)
OS=${getos}
echo ${OS} # show nothing
echo $OS # show nothing
echo $(OS) # line 36
Но bash common.sh получил
linux
common.sh: line 36: OS: command not found
Что проблема ??
bash пытается выполнить команду OS и не работает, потому что
$(OS)
является Command Substitution, тогда как
${OS} # or
$OS
является Command Substitution [!d2 ]
Правильный способ печати содержимого переменной OS - echo $OS.
Предположим, что вы хотите запустить свою функцию, которая присваивает значение вашей переменной OS, а затем распечатать его содержимое, если оно уже не выполняется функцией:
getos
echo $OS
bash пытается выполнить команду OS и не работает, потому что
$(OS)
является Command Substitution, тогда как
${OS} # or
$OS
является Command Substitution
Правильный способ печати содержимого переменной OS - echo $OS.
Предположим, что вы хотите запустить свою функцию, которая присваивает значение вашей переменной OS, а затем распечатать его содержимое, если оно уже не выполняется функцией:
getos
echo $OS
bash пытается выполнить команду OS и не работает, потому что
$(OS)
является Command Substitution, тогда как
${OS} # or
$OS
является Command Substitution
Правильный способ печати содержимого переменной OS - echo $OS.
Предположим, что вы хотите запустить свою функцию, которая присваивает значение вашей переменной OS, а затем распечатать его содержимое, если оно уже не выполняется функцией:
getos
echo $OS
Основная проблема заключается в том, что OS=${getos} ожидает, что getos будет переменной, а не функцией (это расширение параметра, а не подстановка команды) - они фактически разные пространства имен:
$ function foo() { echo foo; }
$ foo
foo
$ echo ${foo}
$
(т.е. переменная foo пуста); тогда как
$ foo=bar
$
$ foo
foo
$ echo ${foo}
bar
Если вы хотите OS быть синонимом getos, вы можете использовать переменную :
alias OS='getos'
( но если вы используете это в скрипте, имейте в виду, что расширение alias включено только в интерактивных оболочках по умолчанию).
TL; DR: скобки и фигурные скобки НЕ взаимозаменяемы
Основная проблема заключается в том, что OS=${getos} ожидает, что getos будет переменной, а не функцией (это расширение параметра, а не подстановка команды) - они фактически разные пространства имен:
$ function foo() { echo foo; }
$ foo
foo
$ echo ${foo}
$
(т.е. переменная foo пуста); тогда как
$ foo=bar
$
$ foo
foo
$ echo ${foo}
bar
Если вы хотите OS быть синонимом getos, вы можете использовать переменную :
alias OS='getos'
( но если вы используете это в скрипте, имейте в виду, что расширение alias включено только в интерактивных оболочках по умолчанию).
TL; DR: скобки и фигурные скобки НЕ взаимозаменяемы
Основная проблема заключается в том, что OS=${getos} ожидает, что getos будет переменной, а не функцией (это расширение параметра, а не подстановка команды) - они фактически разные пространства имен:
$ function foo() { echo foo; }
$ foo
foo
$ echo ${foo}
$
(т.е. переменная foo пуста); тогда как
$ foo=bar
$
$ foo
foo
$ echo ${foo}
bar
Если вы хотите OS быть синонимом getos, вы можете использовать переменную :
alias OS='getos'
( но если вы используете это в скрипте, имейте в виду, что расширение alias включено только в интерактивных оболочках по умолчанию).
TL; DR: скобки и фигурные скобки НЕ взаимозаменяемы