Это решение относится только к башу, а не к 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]}. Встроенный вызывающий абонент отображает текущий стек вызовов, используя эту информацию.
[Источник: Бэш-руководство]
Нет. Основные сигналы, которые обычно используются пользователем для уничтожения процесса:
Ни одно из них не имеет обычного значения, при котором программа подсказывала бы пользователю о чем-либо. Для программы может иметь смысл подсказка SIGTERM, но я не могу придумать программу, которая это делает. Некоторые программы выдают подсказки на SIGINT, предлагая выбор между возвращением на верхний уровень, выходом из программы или входом в режим отладки. Вообще говоря, предположение, когда программа получает ЗАПИСЬ, заключается в том, что пользователь не находится перед консолью, чтобы взаимодействовать с программой, или что программа не отвечает - в противном случае пользователь использовал бы интерактивные элементы управления вместо того, чтобы посылать сигнал.
GUI-события, такие как нажатие кнопки x
в строке заголовка окна, не посылают сигнал, они посылают событие по обычному каналу связи X11.