Если вы хотите использовать экран, используйте что-то вроде:
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
Один из способов добиться этого — посредством косвенной --ссылки на другую переменную из значения первой переменной.
Для демонстрации:
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
Необходимо использовать косвенную ссылку на переменную:
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