Как заставить скрипт оболочки выполнять свои команды в качестве исходных команд, не используя выражение «source scriptname.sh» для запуска скрипта? По сути, я хочу набрать ./scriptname.sh, и его команды будут действовать так, как если бы источник использовался для выполнения сценария оболочки.
3 ответа
Ни одна из оболочек Unix не позволяет пометить скрипт как тот, который всегда должен быть получен так, как вы надеетесь. Что я хотел бы сделать, это создать alias
или процедуру, чтобы сделать то, что вы хотите, и поместить его в мой сценарий запуска. Например, в tcsh:
alias scriptname source \!\!
В bash вы можете написать это как процедуру:
scriptname( ) { source scriptname.sh $*; }
Вы можете использовать функцию bash
которая позволяет вам перехватывать ввод пользователя и воздействовать на него, отменяя любое обычное выполнение команды.
Добавьте следующее в ваш скрипт запуска bash
:
shopt -s extdebug
function auto_source_names {
local CMD=$BASH_COMMAND
if [[ -f "$CMD" ]] && [[ ! -x "$CMD" ]] ; then
source "$CMD"
return 1
else
return 0
fi
}
trap 'auto_source_names' DEBUG
Это приводит к тому, что функция вызывается для каждой выполняемой команды. Если это имя файла, который не является исполняемым (в противном случае мы также заблокировали бы легитимные вызовы ./foo.sh
), он получен, и команда не выполняется. Помните о файлах с именами ls
или rm
в одном каталоге. Вы можете добавить дополнительные меры предосторожности, например, требовать расширение .sh
file
или файл, сообщающий, что имя является текстовым файлом.
Пример:
Создайте foo.sh
:
FOO=bar
Затем:
$ echo $FOO
$ foo.sh
$ echo $FOO
bar
Первая строка должна содержать путь к интерпретатору:
#! /bin/bash
Затем сделайте исполняемый файл скрипта:
chmod +x scriptname.sh
Теперь вы можете запустить ./scriptname.sh
чтобы выполнить его.