3

Как заставить скрипт оболочки выполнять свои команды в качестве исходных команд, не используя выражение «source scriptname.sh» для запуска скрипта? По сути, я хочу набрать ./scriptname.sh, и его команды будут действовать так, как если бы источник использовался для выполнения сценария оболочки.

3 ответа3

4

Ни одна из оболочек Unix не позволяет пометить скрипт как тот, который всегда должен быть получен так, как вы надеетесь. Что я хотел бы сделать, это создать alias или процедуру, чтобы сделать то, что вы хотите, и поместить его в мой сценарий запуска. Например, в tcsh:

alias scriptname source \!\!

В bash вы можете написать это как процедуру:

scriptname( ) { source scriptname.sh $*; }
0

Вы можете использовать функцию 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
-3

Первая строка должна содержать путь к интерпретатору:
#! /bin/bash

Затем сделайте исполняемый файл скрипта:
chmod +x scriptname.sh

Теперь вы можете запустить ./scriptname.sh чтобы выполнить его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .