Я нашел решение внизу предлагаемого дубликата:
определить номера узлов
ls -lbi
25553 -rwxrwxrwx 1 guy guy 1 Sep 7 2016 \177\177
25559 -rwxrwxrwx 1 guy guy 3220 Sep 27 2 \177\177\177\177\177
то можно двигаться при возвращении изfind
:
find. -inum 25553 |xargs -I{} mv {} recovered.x
find. -inum 25559 |xargs -I{} mv {} recovered.y
$SLS_DEBUG_TEXT
раскрывается слишком поздно, после этапа, на котором оболочка в противном случае обработала бы его значение как присвоение. Поэтому вместо этого значение переменной рассматривается как команда.
Вместо этого вы могли бы использоватьenv
:
SLS_DEBUG_TEXT='SLS_DEBUG=*'
env "$SLS_DEBUG_TEXT" sls create_domain -v "$AWS_PROFILE_FLAG" --stage "$STAGE"
Обратите внимание на заключение в кавычки каждого раскрытия переменной .
Если SLS_DEBUG_TEXT
может быть пустым или неустановленным, вышеуказанное приведет к ошибке, поскольку env
попытается выполнить команду без имени.
Чтобы обойти это, вы можете вместо этого использовать
SLS_DEBUG_TEXT='SLS_DEBUG=*'
env ${SLS_DEBUG_TEXT:+"$SLS_DEBUG_TEXT"} sls create_domain -v "$AWS_PROFILE_FLAG" --stage "$STAGE"
${SLS_DEBUG_TEXT:+"$SLS_DEBUG_TEXT"}
расширится до "$SLS_DEBUG_TEXT"
, если эта переменная установлена и не -пуста. В противном случае он превратился бы в ничто (, даже в пустую строку, как в случае с"$SLS_DEBUG_TEXT"
).
Также обратите внимание, что если у вас есть SLS_DEBUG_TEXT='SLS_DEBUG=* '
(, как в вашем коде ), пробел после *
станет частью значения SLS_DEBUG
в среде процесса sls
. Я не знаю, задумано это или нет.
Я также заметил, что сообщение об ошибке, которое вы цитируете, гласит
./sls-deploy.sh: line 110: SLS_DEBUG_TEXT: command not found
Для меня это означает, что вы используете имя переменной без $
перед ним в какой-то момент скрипта. Это может быть совершенно не связано с основной проблемой, которая у вас была. Код, который вы показываете , вместо этого вызовет ошибку
./sls-deploy.sh: line NNN: SLS_DEBUG=*: command not found
Грамматика оболочки распознает слова присваивания на этапе лексирования , задолго до расширения параметров. Хотя у вас может быть параметр, расширяемый до команды , вы не можете расширять его до назначения — в этот момент он просто обрабатывается как команда, даже если он текстуально один и тот же (, это похоже на вас. написал"SLS_DEBUG=*" sls...
).
Это странность синтаксического анализа и оценки языка команд оболочки. Определенные виды поведения определяются лексически при первом считывании кода, и эти поведения никогда не могут быть восстановлены позже, даже несмотря на то, что обычно кажется, что работает текстовая замена.
Вы можете использовать SLS_DEBUG_TEXT="eval SLS_DEBUG='*' "
, и это будет работать, хотя и с потенциальными проблемами, если оставшаяся часть команды когда-либо может содержать какие-либо метасимволы оболочки. Другой вариант — вместо этого условно определить функцию :
sls_debug() { :; }
if [ "$ENABLE_DEBUG_LOGGING" = "true" ]; then
sls_debug() {
SLS_DEBUG='*' "$@"
}
fi
sls_debug sls create_domain...
В качестве альтернативы (и, возможно, более понятной )функция, которая просто проверяет $ENABLE_DEBUG_LOGGING
внутри, также будет работать, или env "$SLS_DEBUG_TEXT"...
или eval "$SLS_DEBUG_TEXT"...
также будут явными.
Для полноты картины я закончил тем, как решил свою проблему, которая представляла собой комбинацию ответа Кусалананды и ответа Майкла Гомера .
function executeServerlessCommand() {
if [ "$ENABLE_SLS_DEBUG_LOGGING" = "true" ]; then
SLS_DEBUG='*' "$@"
else
"$@"
fi
}
executeServerlessCommand sls create_domain -v ${AWS_PROFILE_FLAG:+"$AWS_PROFILE_FLAG"} --stage "$STAGE"
Некоторые замечания:
ENABLE_SLS_DEBUG_LOGGING
и добавляет SLS_DEBUG=*
к команде, если она истинна, в противном случае выполняет предоставленную команду ${a:+"$a"}
для переменной AWS_PROFILE_FLAG
, который добавляет значение переменной, только если оно установлено. Ранее эта переменная не была правильно указана в кавычках.