Получить значение переданного аргумента сценарию, импортирующему переменные из другого сценария

Если вы хотите использовать экран, используйте что-то вроде:

screen -dmS yourscreenname sudo python /path/to/file.py

из rc.local для запуска вашей программы на отдельном экране. Затем после загрузки вы можете подключиться к нему с помощью

screen -r yourscreenname 

из учетной записи root.

В качестве альтернативы - если вы хотите получать журналы только из своей программы - может быть, проще перенаправить вывод в системный журнал? например:

sudo python /path/to/file.py|logger

Если вы хотите также перенаправить стандартный вывод ошибок, не забудьте про 2> & 1:

sudo python /path/to/file.py 2>&1 |logger
3
30.05.2019, 19:07
2 ответа

Один из способов добиться этого — посредством косвенной --ссылки на другую переменную из значения первой переменной.

Для демонстрации:

apple="Red"
var="apple"
echo "${!var}"

Результаты в:

Red

Потому что bash сначала принимает !varкак значение переменной var, которое затем интерпретируется через ${apple}и превращается в Red.

В результате ваш скрипт GetFruitColour.sh может выглядеть так:

#!/bin/bash

source./fruitcolour.sh

for arg in "$@"
do
  printf 'The colour of %s is %s.\n' "$arg" "${!arg}"
done

Я сделал путь к исходному скрипту относительным, а не голым, чтобы было понятнее, где находится файл (если данное имя файла не содержит косой черты, оболочки будут искать его в переменной $PATH, что может вас удивить ).

Я также изменил echoнаprintf.

Функциональное изменение заключается в использовании циклической переменной $argи ее косвенного расширения для получения желаемых значений:

$./GetFruitColour.sh apple mango
The colour of apple is Red.
The colour of mango is Yellow.

Обратите внимание, что здесь нет ошибки -при проверке:

$./GetFruitColour.sh foo
The colour of foo is.

Возможно, вам будет проще использовать ассоциативный массив:

declare -A fruits='([orange]="Orange" [apple]="Red" [mango]="Yellow" [pear]="Green" )'

for arg in "$@"
do
  if [ "${fruits["$arg"]-unset}" = "unset" ]
  then
    echo "I do not know the color of $arg"
  else
    printf 'The colour of %s is %s.\n' "$arg" "${fruits["$arg"]}"
  fi
done
6
27.01.2020, 21:10

Необходимо использовать косвенную ссылку на переменную:

If the first character of parameter is an exclamation point (!), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.

Fruitcolor.sh:

#!/bin/bash

source fruitcolor.sh

echo "The color of $1 is ${!1}"

$./getfruitcolor.sh apple
The color of apple is Red
3
27.01.2020, 21:10

Теги

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