Установка переменной оболочки перед выводом команды «команда не найдена»

Я нашел решение внизу предлагаемого дубликата:

  1. определить номера узлов

    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
    
  2. то можно двигаться при возвращении изfind:

    find. -inum 25553  |xargs -I{} mv {} recovered.x
    find. -inum 25559  |xargs -I{} mv {} recovered.y
    
0
02.09.2019, 12:59
3 ответа

$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
6
28.01.2020, 02:13

Грамматика оболочки распознает слова присваивания на этапе лексирования , задолго до расширения параметров. Хотя у вас может быть параметр, расширяемый до команды , вы не можете расширять его до назначения — в этот момент он просто обрабатывается как команда, даже если он текстуально один и тот же (, это похоже на вас. написал"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"...также будут явными.

4
28.01.2020, 02:13

Для полноты картины я закончил тем, как решил свою проблему, которая представляла собой комбинацию ответа Кусалананды и ответа Майкла Гомера .

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"

Некоторые замечания:

  1. Я создал функцию, которая принимает команду для запуска, проверяет переменную ENABLE_SLS_DEBUG_LOGGINGи добавляет SLS_DEBUG=*к команде, если она истинна, в противном случае выполняет предоставленную команду
  2. Я использовал синтаксис ${a:+"$a"}для переменной AWS_PROFILE_FLAG, который добавляет значение переменной, только если оно установлено. Ранее эта переменная не была правильно указана в кавычках.
2
28.01.2020, 02:13

Теги

Похожие вопросы