Запуск внешнего сценария с исходной командой

"Ответ", нравится или нет, то, что функциональность не доступна там.

Некоторые альтернативные опции:

  • Используя окно минимизируют значок
  • Использовать alt-f9
5
05.09.2013, 13:08
2 ответа

Используя источник

Команда source не запускает другой скрипт. Просто это вытягивает содержание этого другого сценария в этот сценарий и затем выполняет его содержание, как будто это была первоначально часть сценария выполнения вызова.

Это - в основном механизм для включения содержания другого сценария в тот же объем как собственное.

Используя readlink

Эта команда там в случае, если исходный сценарий был вызван через ссылку.

Используя sed

Этот сценарий использует sed для преобразования названия сценария выполнения вызова к имени config.

Пример

Скажите, что у нас есть этот сценарий, названный orig.bash:

#!/bin/bash

printf "exectued as:  %s\n" $0
cmd=$(readlink -e $0 | sed "s:[^/]*$:config:")
printf "sourcing as:  %s\n" "$cmd"

Эта программа сделает 2 вещи.

  1. распечатайте значение $0

    printf "exectued as:  %s\n" $0
    
  2. распечатайте значение readlink ... команда

    cmd=$(readlink -e $0 | sed "s:[^/]*$:config:")
    printf "sourcing as:  %s\n" "$cmd"
    

Теперь давайте создадим ссылку на этот сценарий, link2orig.bash. Таким образом, у нас есть следующие файлы теперь в нашем каталоге:

# creates link
$ ln -s orig.bash link2orig.bash

# results after
$ ls -l
total 4
lrwxrwxrwx 1 saml saml   9 Sep  5 06:23 link2orig.bash -> orig.bash
-rwxrwxr-x 1 saml saml 126 Sep  5 06:31 orig.bash

Теперь наблюдайте то, что происходит

Таким образом, теперь, когда мы запускаем наш скрипт в качестве примера с помощью, или это - настоящее имя или ссылка, мы все еще можем заменить в аргумент вызывающей стороны строкой config. Который является другим файлом, который имеет конфигурационную информацию для нашего сценария, который мы получаем.

$ ./orig.bash 
executed as:  ./orig.bash
sourcing as:  /home/saml/tst/89518/config

$ ./link2orig.bash 
executed as:  ./link2orig.bash
sourcing as:  /home/saml/tst/89518/config

Если Вы заметите, одно из преимуществ для этого подхода - то, что это чрезвычайно терпимо к тому, чтобы быть названным по-разному и от различных местоположений в системе.

$ ../89518/orig.bash 
executed as:  ../89518/orig.bash
sourcing as:  /home/saml/tst/89518/config

$ ../89518/link2orig.bash 
executed as:  ../89518/link2orig.bash
sourcing as:  /home/saml/tst/89518/config
4
27.01.2020, 20:38
  • 1
    . ДЕЙСТВИТЕЛЬНО запускает другой скрипт в текущей среде оболочки.Насколько мне известно, source просто a bashism для . без механизма безопасности требования квалифицированного пути, хотя я мог быть неправым. Насколько я понимаю единственная реальная разница между этими двумя source script.sh работы, тогда как . script.sh не делает если Вы . ./script.sh. В любом случае, сценарий и любые функции или программы, которые это называет, выполняются. –  mikeserv 14.03.2014, 03:54
  • 2
    Вышеупомянутый комментарий был обсужден больше часа в чат-комнате. Несколько примеров были представлены, который продемонстрировал всем кроме mikeserv, что ответ, который я охарактеризовал выше, точно, что продолжается. –  slm♦ 14.03.2014, 06:22
  • 3
    Это верно, что было обсуждено. Были некоторые странные семантические аргументы на том, что выполняется и что выполняется и безотносительно. Я думаю, к чему это свелось, был, некоторые сказали, что скрипт не запущен, если этого не происходит в его собственном процессе. По-моему: echo this is run $(echo and this is run). Я думал - и все еще сделал - что было опасно предположить, что полученный скрипт не запущен, потому что, снова, эхо 'отзывается эхом, это выполняется'> ~/script.sh; . ~/script.sh и ( . ~/script.sh ) оба выполняются. На самом деле, a. запущенный скрипт влияет на Вашу текущую среду и так более рискован для выполнения. –  mikeserv 14.03.2014, 08:06

$0 путь к сценарию. Это обычно - полный путь к сценарию (т.е. полный путь, начиная с /). В общем падеже, где сценарий является исполняемым файлом и запускается со строки хижины, путь будет полным путем. Если оболочка была вызвана явно, однако, $0 то, что пользователь, введенный на командной строке, которая не может включать путь (с cd somedir; bash minecraft, $0 minecraft). Если оболочка вызывается со сценарием на стандартном входе, $0 имя или путь оболочки (с bash <minecraft, $0 bash).

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

Преобразование на имени заменяет базовое имя сценария config. Таким образом, если $0 (или readlink $0 в зависимости от обстоятельств), /path/to/minecraft затем sed управляют выводами /path/to/config. Это работает, даже если путь не содержит никого /: minecraft заменяется config.

Точка этого сценария должна искать названный файл config в том же каталоге как сценарий и источник, что (т.е. читают и выполняют тот сценарий в том же контексте как сценарий выполнения вызова). config конфигурационный файл, который предназначен для определения переменных, которые используются позже minecraft сценарий.

Сценарий пропускает двойные кавычки вокруг замен команды и переменной. Это должно быть записано

if [ -L "$0" ]
then
    source "$(readlink -e "$0" | sed 's:[^/]*$:config:')"
else
    source "$(echo "$0" | sed 's:[^/]*$:config:')"
fi

Это все еще перестало работать если путь к существам сценария с a - или содержит новую строку, но это редкие случаи.

Та же идея могла быть записана с конструкциями обработки строк оболочки (за исключением внешнего вызова к readlink).

case $0 in */*) config=$0;; *) config=./$0;; esac  # make sure there is a / in $config
if [ -L "$config" ]; then config=$(readlink -e -- "$config"); fi
config=${config%/*}/config
2
27.01.2020, 20:38

Теги

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