Запустить команду вместе с аргументами в bash

Программа addr2lineимела ошибку сегментации с ошибкой 6 (при попытке записи в неотображенную память ). Вероятно, в этот момент программа дала сбой.

Подробный ответ о том, как интерпретировать сообщение, содержится в Stack Overflow .

0
01.12.2020, 17:44
2 ответа

См. http://mywiki.wooledge.org/BashFAQ/050, "Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!"

Это сложнее, чем вы думаете. Каждая команда должна быть помещена в отдельный массив. И поскольку bash не реализует многомерные массивы, вам нужно иметь некоторое управление вокруг него.

Попробуйте это:

CMD_date=( date "+%a %b %d %Y %T" )
CMD_ls=( ls -l )
CMD_sh=( env MyVar="this is a variable" sh -c 'echo "$MyVar"' )
commands=( date ls sh )

for cmd in "${commands[@]}"; do
  declare -n c="CMD_$cmd"   # set a nameref to the array
  "${c[@]}"              # and execute it
done

ссылки на имена были введены в bash 4.3 --если ваш bash старше, он все еще может работать с косвенными переменными

for cmd in "${commands[@]}"; do
  printf -v tmp 'CMD_%s[@]' "$cmd"
  "${!tmp}"    # and execute it
done

Лучше :использовать функции:

CMD_date() {
  date "+%a %b %d %Y %T"
}
CMD_ls() {
  ls -l
}
CMD_sh() {
  env MyVar="this is a variable" sh -c 'echo "$MyVar"'
}
commands=( date ls sh )

for cmd in "${commands[@]}"; do
  "CMD_$cmd"
done
4
18.03.2021, 22:46

Я нашел решение, но не знаю, хорошо это или плохо. Приветствуется любой совет:

for (( i=0; i<${#COMMANDS[@]}; i=i+1 )); do
    clear

    # added bash -c in front.
    bash -c "${COMMANDS[$i]}"
    gnome-screenshot -w -f "$i".png
done
0
18.03.2021, 22:46

Теги

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