пройдемся (как сможем)) по скрипту запуска емс подробно,
вплоть до синтаксиса bash ...
------------------
Код: Выделить всё
prefix=/home/nkp/emc2-sim
exec_prefix=${prefix}
LINUXCNC_HOME=/home/nkp/emc2-sim; export LINUXCNC_HOME
LINUXCNC_BIN_DIR=/home/nkp/emc2-sim/bin
LINUXCNC_TCL_DIR=/home/nkp/emc2-sim/tcl
LINUXCNC_HELP_DIR=/home/nkp/emc2-sim/docs/help
LINUXCNC_RTLIB_DIR=/home/nkp/emc2-sim/rtlib
LINUXCNC_CONFIG_PATH="~/linuxcnc/configs:/home/nkp/emc2-sim/configs"
LINUXCNC_NCFILES_DIR=/home/nkp/emc2-sim/nc_files
LINUXCNC_LANG_DIR=/home/nkp/emc2-sim/src/objects
REALTIME=/home/nkp/emc2-sim/scripts/realtime
LINUXCNC_IMAGEDIR=/home/nkp/emc2-sim
LINUXCNC_TCL_LIB_DIR=/home/nkp/emc2-sim/tcl
PATH=$LINUXCNC_BIN_DIR:$PATH
вначале идет присваивание значений переменным... (пробелы до и после = недопустимы)
по умолчанию переменные являются локальными,чтоб сделать
их глобальными(переменные окружения) применяется команда
export
export LINUXCNC_HOME
списки значений записываются через двоеточие (':')
LINUXCNC_CONFIG_PATH="~/linuxcnc/configs:/home/nkp/emc2-sim/configs"
посмотреть переменные окружения можно командой в терминале printenv
в выведеном списке HOME - путь к вашей домашней папке (переменная HOME используется в "нашем" скрипте)
упрощенно:
variable - переменная
$variable или ${variable} - значение переменной
---------------------
Код: Выделить всё
LSMOD=/sbin/lsmod # команда управления модулями http://nix.zeya.org/wiki/Lsmod
PIDOF="/bin/pidof -x" # команда , идентификатор процессов (PID) http://ru.wikipedia.org/wiki/Pidof----------------------------
PS=/bin/ps # ps (process status) — отчёт о работающих процессах http://ru.wikipedia.org/wiki/Ps
AWK=/usr/bin/awk # http://rus-linux.net/MyLDP/consol/awk.html
IPCS=/usr/bin/ipcs # информации о состоянии средств межпроцессной связи http://citforum.ru/operating_systems/manpages/IPCS.1.shtml
KILL=/bin/kill # http://pingvinus.ru/note/ps-kill-killall
эти переменные используются командами функции завершения процессов( KillTaskWithTimeout() )
------------------
[ -d $LINUXCNC_HOME/scripts ]
выражение в квадратных скобках - синтаксис команды
test , результат которой true или false...
&& - применяется ,когда нужно выполнить вторую команду в зависимости
от успешности выполнения первой:
попросту - если [ -d $LINUXCNC_HOME/scripts ] уже False , то вторую команду уже нет смысла и выполнять (исходя
из того ,что && "руководствуется" правилами логического AND)
в этом скрипте командв test проверяет:
-d существует ли указанная папка
-z пустая ли указанная строка
-n не пустая ли указанная строка
в
[ -d $LINUXCNC_HOME/scripts ] && PATH=$LINUXCNC_HOME/scripts:$PATH
если существует папка $LINUXCNC_HOME/scripts (значение переменной $LINUXCNC_HOME
берем выше - LINUXCNC_HOME=/home/nkp/emc2-sim) , то левая часть - true , и значит
выполняем правую (после &&),
то есть присваиваем переменной
PATH значение (в данном случае - список путей через двоеточие)
---------------------
далее - немаловажный момент - вывод информции для отладки программы...
по умолчанию емс создает два временных файла в /tmp
DEBUG_FILE=$(mktemp /tmp/linuxcnc.debug.XXXXXX)
PRINT_FILE=$(mktemp /tmp/linuxcnc.print.XXXXXX)
и в них перенаправляется вся отладочная информация,
если только скрипт не был запущен с аргументом -d :
linuxcnc -d
(для просмотра содержимого нажмите на ссылку)Код: Выделить всё
while getopts "dvlhkr" opt
do
case "$opt" in
d)
# enable echoing of script and command output
if tty -s; then
DEBUG_FILE=/dev/fd/2
echo "Debug mode on" >$DEBUG_FILE
fi
set -x;; # activate debugging (set +x # stop debugging)-------------------------------------------------
v)
# enable printing of verbose messages
if tty -s; then
PRINT_FILE=/dev/fd/1
echo "Verbose mode on" >$PRINT_FILE
fi;;
r)
RUNTESTS=yes
;;
l)
USE_LAST_INIFILE=1;;
k) DASHK=-k;; #http://www.linuxcnc.org/docs/2.5/html/man/man1/halcmd.1.html
h)
usage
exit 0;;
*)
usage
exit 1
esac
done
здесь в скрипте обрабатываются все возможные
аргументы
имхо самым полезным являетя -d
if tty -s; then
DEBUG_FILE=/dev/fd/2
echo "Debug mode on" >$DEBUG_FILE
fi
команда
tty "говорит" - запущен ли терминал
в таком случае вывод перенаправляется в стандартный поток ошибок /dev/fd/2
если нет - активируется режим debugging (
set -x;;)(деактивируется +x)
~~~~~~~~~~~~
режим debugging можно устанавливать и в файле
ini в секции [EMC]
0x00000000 Do not print any debugging messages.
0x00000001 Print invalid messages
0x00000002 Print configuration settings
0x00000004 Print defaults
0x00000008 Print version
0x00000010 Print task messages
0x00000020 Print IO points
0x00000040 Print NML messages
0x00000080 Print time taken for motion to complete
0x00000100 Print interpreter debugging
0x00000200 Print RCS debugging
0x00000400 Print raw trajectory data
0x00000800 Print interpreter list
0x7FFFFFFF Print all debugging messages
-----------------------------------------------
об остальных возможных аргументах:
-v включает режим подробных сообщений
-k присваивает DASHK=-k и "разрешает" halcmd выполнять команды далее после ошибки
http://www.linuxcnc.org/docs/2.5/html/m ... cmd.1.html
-h выводит help:
(для просмотра содержимого нажмите на ссылку)Код: Выделить всё
usage () {
P=${0##*/}
cat <<EOF
$P: Run LINUXCNC
Usage:
$P [-d] [-v]
Choose the configuration file graphically
$P [-k] [-d] [-v] path/to/your.ini
Name the configuration file using its path
$P [-k] [-d] [-v] -l
Use the previous configuration file
-d: Turn on "debug" mode
-v: Turn on "verbose" mode
-k: Continue in the presence of errors in .hal files
EOF
}