Программы Linux могут быть отправлены команду SIGXXX, на которую они могут ответить в UI?

Это решение относится только к башу, а не к tcsh. Обратите внимание, что обычно поставляемый ответ ${BASH_SOURCE[0]} не будет работать, если попытаться найти путь изнутри функции.

Я нашел эту строку, чтобы всегда работать, независимо от того, исходит ли файл или запускается в качестве скрипта.

echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}

Если вы хотите следовать по симлинкам, используйте readlink на пути, который вы получаете выше, рекурсивно или не рекурсивно.

Вот скрипт, чтобы попробовать его и сравнить с другими предложенными решениями. Вызовите его как source test1/test2/test_script.sh или bash test1/test2/test_script.sh.

#
# Location: test1/test2/test_script.sh
#
echo $0
echo $_
echo ${BASH_SOURCE}
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}

cur_file="${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}"
cur_dir="$(dirname "${cur_file}")"
source "${cur_dir}/func_def.sh"

function test_within_func_inside {
    echo ${BASH_SOURCE}
    echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
}

echo "Testing within function inside"
test_within_func_inside

echo "Testing within function outside"
test_within_func_outside

#
# Location: test1/test2/func_def.sh
#
function test_within_func_outside {
    echo ${BASH_SOURCE}
    echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
}

Причина, по которой работает один лайнер, объясняется использованием переменной окружения BASH_SOURCE и ее ассоциированной FUNCNAME.

BASH_SOURCE

Переменная массива, членами которой являются имена исходных файлов, в которых определены соответствующие имена функций оболочки в переменной массива FUNCNAME. Функция оболочки ${FUNCNAME[$i]} определена в файле ${BASH_SOURCE[$i]} и вызывается из ${BASH_SOURCE[$i+1]}.

FUNCNAME

- переменная массива, содержащая имена всех функций оболочки, находящихся в стеке вызовов выполнения. Элемент с индексом 0 является именем любой выполняемой в данный момент функции оболочки. Самый нижний элемент (элемент с наибольшим индексом) является "главным". Эта переменная существует только при выполнении функции оболочки. Присвоения FUNCNAME не имеют никакого эффекта и возвращают статус ошибки. Если FUNCNAME не установлено, то она теряет свои специальные свойства, даже если впоследствии сбрасывается.

Эту переменную можно использовать с BASH_LINENO и BASH_SOURCE. Каждый элемент FUNCNAME имеет соответствующие элементы в BASH_LINENO и BASH_SOURCE для описания стека вызовов. Например, из файла ${BASH_SOURCE[$i+1]} по номеру строки ${BASH_LINENO[$i]} был вызван ${FUNCNAME[$i]}. Встроенный вызывающий абонент отображает текущий стек вызовов, используя эту информацию.

[Источник: Бэш-руководство]

1
03.08.2014, 15:04
1 ответ

Нет. Основные сигналы, которые обычно используются пользователем для уничтожения процесса:

  • SIGINT (посылается Ctrl+C в терминале) - прервать текущую операцию и перейти к интерактивному циклу верхнего уровня. Если в программе отсутствует интерактивный цикл верхнего уровня, то программа завершается.
  • SIGTERM - остановить программу чисто. При этом может произойти аварийное сохранение.
  • SIGHUP - отправка системой программе, запущенной на терминале, при завершении работы терминала. Обычно обрабатывается как SIGTERM.
  • SIGQUIT (посланный Ctrl+\ в терминале) - умирает без очистки и дампа ядра (для отладки).
  • SIGKILL - программа умирает и не имеет возможности выполнить какую-либо очистку.

Ни одно из них не имеет обычного значения, при котором программа подсказывала бы пользователю о чем-либо. Для программы может иметь смысл подсказка SIGTERM, но я не могу придумать программу, которая это делает. Некоторые программы выдают подсказки на SIGINT, предлагая выбор между возвращением на верхний уровень, выходом из программы или входом в режим отладки. Вообще говоря, предположение, когда программа получает ЗАПИСЬ, заключается в том, что пользователь не находится перед консолью, чтобы взаимодействовать с программой, или что программа не отвечает - в противном случае пользователь использовал бы интерактивные элементы управления вместо того, чтобы посылать сигнал.

GUI-события, такие как нажатие кнопки x в строке заголовка окна, не посылают сигнал, они посылают событие по обычному каналу связи X11.

1
27.01.2020, 23:52

Теги

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