"Ответ", нравится или нет, то, что функциональность не доступна там.
Некоторые альтернативные опции:
alt-f9
Команда source
не запускает другой скрипт. Просто это вытягивает содержание этого другого сценария в этот сценарий и затем выполняет его содержание, как будто это была первоначально часть сценария выполнения вызова.
Это - в основном механизм для включения содержания другого сценария в тот же объем как собственное.
Эта команда там в случае, если исходный сценарий был вызван через ссылку.
Этот сценарий использует 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 вещи.
распечатайте значение $0
printf "exectued as: %s\n" $0
распечатайте значение 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
$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
.
ДЕЙСТВИТЕЛЬНО запускает другой скрипт в текущей среде оболочки.Насколько мне известно,source
просто abashism
для.
без механизма безопасности требования квалифицированного пути, хотя я мог быть неправым. Насколько я понимаю единственная реальная разница между этими двумяsource script.sh
работы, тогда как. script.sh
не делает если Вы. ./script.sh
. В любом случае, сценарий и любые функции или программы, которые это называет, выполняются. – mikeserv 14.03.2014, 03:54echo this is run $(echo and this is run)
. Я думал - и все еще сделал - что было опасно предположить, что полученный скрипт не запущен, потому что, снова, эхо 'отзывается эхом, это выполняется'> ~/script.sh;. ~/script.sh
и( . ~/script.sh )
оба выполняются. На самом деле, a. запущенный скрипт влияет на Вашу текущую среду и так более рискован для выполнения. – mikeserv 14.03.2014, 08:06