2015-01-20 3 views
4

Я работаю с: s3-bash, когда я запускаю его в своей локальной среде (OS X 10.10.1) У меня нет проблем, когда я пытаюсь запустить его на ubuntu server 14.04.1 I получить следующее сообщение об ошибке:Bash unbound variable array (script: s3-bash)

./s3-common-functions: line 66: temporaryFiles: unbound variable 
./s3-common-functions: line 85: temporaryFiles: unbound variable 

Я смотрел на s3-common-functions сценарии и переменные выглядит инициализироваться правильно (как массив):

# Globals 
declare -a temporaryFiles 

Но есть примечание в комментариях, и я уверен, что это связано:

# Do not use this from directly. Due to a bug in bash, array assignments do not work when the function is used with command substitution 
function createTemporaryFile 
{ 
    local temporaryFile="$(mktemp "$temporaryDirectory/$$.$1.XXXXXXXX")" || printErrorHelpAndExit "Environment Error: Could not create a temporary file. Please check you /tmp folder permissions allow files and folders to be created and disc space." $invalidEnvironmentExitCode 
    local length="${#temporaryFiles[@]}" 
    temporaryFiles[$length]="$temporaryFile" 
} 
+1

'несвязанный variable' является то, что вы получаете при использовании' установить -u'. У вас есть этот набор в любой среде, в которой запущен скрипт? –

+1

Какая команда вы запускаете, что вызывает эту ошибку? –

+2

Ошибка? То, что описано в тексте комментария, не является ошибкой, а нормальным и ожидаемым поведением. 'foo = $ (bar)' работает 'bar' в подоболочке, поэтому ** конечно ** присваивания, выполненные внутри этой подоболочки, не распространяются на родительскую оболочку. –

ответ

9

Служаю, что здесь наблюдается изменение поведения bash.

Найденный Кодзиро: CHANGES

hhhh. Fixed a bug that caused `declare' and `test' to find variables that had been given attributes but not assigned values. Such variables are not set.

$ bash --version 
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) 
Copyright (C) 2005 Free Software Foundation, Inc. 
$ set -u 
$ declare -a tF 
$ echo "${#tF[@]}" 
0 

против

$ bash --version 
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) 
Copyright (C) 2009 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
$ set -u 
$ declare -a tF 
$ echo "${#tF[@]}" 
0 

против

$ bash --version 
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu) 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
$ set -u 
$ declare -a tF 
$ echo "${#tF[@]}" 
-bash: tF: unbound variable 

Вы можете использовать declare -a tF=() на более новые версии Баш работать вокруг Тхи s.

$ declare -a tF=() 
$ echo "${#tF[@]}" 
0 
+3

Изменено между bash-4.2-release и bash-4.3-alpha: [_hhhh. Исправлена ​​ошибка, из-за которой \ 'declare 'и \' test' находили переменные, которым были присвоены атрибуты, но не присвоенные значения. Такие переменные не установлены ._] (https://tiswww.case.edu/php/chet/bash/CHANGES) - (извините txt не позволяет более точную привязку, но вы можете искать точный текст, если хотите .) – kojiro

+1

@kojiro Спасибо, что нашли это. –

0

Измененное объявление массива для temporaryfiles

declare -a temporaryFiles 

к:

temporaryFiles=() 

Почему это отличается/не функция ubuntu 14.04.1 Linux 3.13.0-32-generic x86_64 против OS X я не уверен?

2

Bash может заменить пустое значение на неустановленные переменные, используя тире.

set -u 
my_array=() 
printf "${my_array[@]-}\n" 

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

Stolen from here

+0

Это не сработает при попытке найти размер. То есть $ {# my_array [@] -} создаст ошибку с плохой заменой. – kenj