2014-09-16 2 views
0

У меня есть сценарий, который имеет a.sh:использовать только функции .ksh сценария в другой сценарий

a() { 
    echo "123" 
    } 

echo "dont" 

Тогда у меня есть другой сценарий, который имеет b.sh:

b() { 
     echo "345" 
} 

Все, что я хочу сделать, это использовать a в b, но когда я его источник, я не хочу печатать все, что есть в a() или echo "Dont".

На данный момент я хочу указать источник.

так что я сделал, источник a.sh в b.sh

Но это не работает.

Причина поиска. поэтому, если я хочу, я могу вызвать любые функции, когда захочу.

Если я делаю . /a.sh в b.sh, он печатает все в a.sh.

+0

Можете ли вы сделать '. /a.sh>/dev/null'? –

+0

В bash вы можете проверить это, посмотрев на значение '$ {# BASH_SOURCE [@]}'. Не уверен, что версии ksh и ksh немного отличаются друг от друга. Не могли бы вы указать, что вы используете? –

+0

@CharlesDuffy - вы имеете в виду $ {# BASH_SOURCE [a.sh]} ??? usr/bin/ksh – kyle

ответ

1

сделать библиотеку общих функций в файле с именем functionLib.sh так:

#!/bin/sh 

a(){ 
    echo Inside a, with $1 
} 

b(){ 
    echo Inside b, with $1 
} 

Тогда в script1, сделайте следующее:

#!/bin/sh 
. functionLib.sh # Source in the functions 

a 42    # Use one 
b 37    # Use another 

и в другом сценарии, script2 повторно использовать функции :

#!/bin/sh 
. functionLib.sh # Source in the functions 

a 23    # Re-use one 
b 24    # Re-use another 
+0

это не будет работать, если у меня есть три файла? я прав? – kyle

+0

Он будет работать, создайте другой скрипт, который использует 'a()' также просто 'dot in' functionLib.sh, как вторая строка моего второго примерного кода. –

+0

Просто для понимания, так что вы запускаете другой скрипт, который вызывает функциюllib.sh и с помощью 42, то печать whatevr в() правильная? – kyle

2

Один подход, который будет работать на пу POSIX-совместимая оболочка заключается в следующей:

# put function definitions at the top 
a() { 
    echo "123" 
} 

# divide them with a conditional return 
[ -n "$FUNCTIONS_ONLY" ] && return 

# put direct code to execute below 
echo "dont" 

... и в вашем другом сценарии:

FUNCTIONS_ONLY=1 . other.sh 
1

я принял стиль в своих скриптах оболочки, что позволяет мне создавать каждый сценарий как потенциал библиотеки, что ведет к поведению по-разному, когда оно получено (с . .../path/script) и когда оно выполняется напрямую. Вы можете сравнить это с трюком python if __name__ == '__main__':.

я не нашел способ, который является портативным во всех потомков оболочки Bourne без явного ссылаясь на имя сценария, но это то, что я использую:

a() { 
    echo a 
} 

b() { 
    echo b 
} 


(program=xyzzy 
    set -u -e 
    case $0 in 
    *${program}) : ;; 
    *) exit;; 
    esac 

    # main 
    a 
    b 
) 

Правила этого метода строго:

  1. Запустить раздел, содержащий только функции. Нет назначений переменных или любого другого вида деятельности.

  2. Затем, в самом конце, создать подоболочку ( ... )

  3. Первое действие внутри тестов подоболочка ли это время источников.Если это так, выйдите из подоболочки. Если нет, запустите команду.

+1

+1 Хорошая идея, Хенк. –

+1

Если вы хотите избежать накладных расходов на подоболочку, вы можете использовать 'return', а не' exit' - хотя, конечно, это означает, что вы хотите переместить побочные части своей преамбулы после/ниже теста. –

+0

@CharlesDuffy Я боюсь, что использование 'return' может не работать со всеми оболочками. Я тестировал выше с помощью ksh93, bash и '/ bin/sh' на ubuntu (который, на мой взгляд, действительно тире). –

Смежные вопросы