Как передать команду с ее аргументами в качестве одного аргумента в скрипт? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть скрипт, который я использую для сборки своего ядра, и в нем есть функция, которую я хочу использовать для отлова ошибок в моих командах сборки, но я не могу понять, как передать несколько аргументов как один, чтобы получить егоработает правильно.Синтаксис выглядит следующим образом:

run_build() {
cmd=$($1)
status=${PIPESTATUS[0]}
$*
if ($status != 0); then
    echo "$cmd failed!"
    exit 1
else
    echo "$cmd succeeded."
fi
}

Проблема заключается в том, что, когда я пытаюсь передать команду make с ее аргументами, команда make выполняется без аргументов.Я пытался использовать синтаксис «$ *» для вызова всех аргументов, но, похоже, он не работает.Пример команды:

make O=out -j8 zImage

Мне нужно включить следующие 3 аргумента при вызове строки из скрипта.У кого-нибудь есть идеи?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Правильное решение для этого, вероятно, что-то вроде

if "$@"; then
    echo "$@ succeeded" >&2
else
    rc=$?
    echo "$@ failed" >&2
fi

, но все равно кажется, что вы заменяете совершенно хорошую встроенную функциональность чем-то худшим.

0 голосов
/ 19 февраля 2019

Не увлекаюсь этой настройкой по нескольким очевидным причинам и по нескольким менее очевидным.

Для справки, см. на этой странице о том, почему бы не сделать это .
Также достоинобратите внимание, что если вы перейдете на eval, что в идеальном смысле является тем же, что делает эта функция ... , пожалуйста, прочтите это тоже .

... но для упрощенного решения -
Аргументы представляются в виде массива.Если вы выполняете сборку, то заставьте свою функцию запустить сборку с в кавычках аргументами.

run_build() {
  if make "$@"  # QUOTED, *explicit* call to make
  then echo "'make $@' succeeded."
  else echo "'make $@' failed."
       return 1 # exit in function only sets return - be explicit
  fi
}

run_build O=out -j8 zImage # run_build as a make synonym

Не пытайтесь создавать функции "что-нибудь".
Этот путь кроется в безумии.

Если вы должны использовать другие команды, кроме make, то подтвердите и подтвердите.

run_build() {
  local cmd=$1
  shift
  case "$cmd" in
  make|or|some|other|specifically|ok|word)
    if "$cmd" "$@" # QUOTED!!!
    then echo "'$cmd $@' succeeded." 
    else echo "'make $@' failed."
         return 1 
    fi 
  ;;
  *) echo "Invalid argument: '$cmd' not recognized."
     return 1
  ;;
  esac
}

Если вы не вхотя бы делать это, какова цель функции?Я имею в виду, что вы в любом случае передаете все части команды и не делаете с ними ничего, кроме выполнения их.Почему бы просто ... вы знаете, выполнить их, вместо того, чтобы возиться с функцией?Но даже если вы придерживаетесь самого простого, цитируйте, цитируйте, цитируйте.

run_build() { "$@" && echo "'$@' succeeded" || {
                      echo "'$@'failed; return 1; }; }
0 голосов
/ 19 февраля 2019

Первое, вы не хотите передавать всю команду как один аргумент: Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!

Это основная ошибка: cmd=$($1) - синтаксис $() вызывает Подстановка команд , что выполняет первый аргумент.Просто используйте cmd=$1 для сохранения первого параметра в переменной "cmd".

Дополнительные ошибки:

  • if ($status != 0); then - этот синтаксис неверен: используйте if ((status != 0)); then дляправильная арифметическая оценка.
  • $* - для правильного выполнения позиционных параметров используйте "$@" (с кавычками) - эта форма будет поддерживать любые аргументы, содержащие пробелы, как и предполагалось.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...