2015-05-19 4 views
0

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

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

#! /bin/sh 
extract_data() 
{ 
    arg1 = $1 
    // massage data code 
    output=massaged data 
    return 0 
} 

Perl скрипт:

Так вот я хочу, чтобы присвоить значение выходной переменной из подпрограммы оболочки для выходной переменной сценария Perl. Но то, что я нашел, доступно только в том случае, если я повторяю эту выходную переменную в подпрограмме shell, как показано ниже.

#! /bin/sh 
extract_data() 
{ 
arg1 = $1 
// massage data code 
output=massaged data 
echo $output 
} 

Я не хочу, чтобы эхо выходной переменной, как это конфиденциальные данные & будут выставлены в журналах других сценариях оболочки.

Просьба сообщить.

ответ

1
my $output = `source /path/my_shell-script.sh; extract_data arg1; echo \$output`; 

Ваша функция оболочки задает переменную в оболочке. Но эта переменная теряется при выходе оболочки. Вам нужно распечатать его на stdout, который захватывает backticks Perl.

+0

Это дает мне ниже ошибки, как PERL скрипт не может распознать выходную переменную из сценария оболочки. Глобальный символ «$ output» требует явного имени пакета в строке may.pl 35. – CuriousOne

+0

Извините, забыли обратную косую черту. – cjm

+0

Он также работает. Благодаря! – CuriousOne

2

Это невозможно сделать взаимодействие между двумя процессами без дескриптора файла (по умолчанию это стандартный вывод, STDERR и STDIN) при использовании системы или `` или даже open2/open3 звонков.

Но если проблема заключается только в том, что вы не хотите разорвать код вашего сценария оболочки, вы можете обернуть его другой функцией в оболочке и вызвать ее из perl. Вы можете сделать что-то вроде этого:

Добавить код в my_shell-script.sh:

print_output() 
{ 
    echo $output 
} 

И ваш PERL скрипт:

my $output = `source /path/my_shell-script.sh; extract_data arg1; print_output`; 

Но это ужасно. Не используйте глобальные переменные. Это может быть хорошим всплеском. Но было бы лучше использовать return.

+0

Спасибо. Это сработало. – CuriousOne

1

Вы хотите иметь эхо, когда my_shell-script.sh вызывается Perl, а не когда он вызывается другим скриптом. Сценарий должен решить, вызывается ли он Perl.
два метода являются:

  1. Используйте параметр/вариант, чтобы скрипт, должен выводить результат
  2. Пусть my_shell-script.sh проверить родительский процесс и эхо, когда родитель Perl.

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

#!/bin/sh 
extract_data_process() 
    arg1=$1 
    // massage data code 
    output=massaged data 
    echo $output 
} 

extract_data() 
{ 
    extract_data_process $1 >/dev/null 2>&1 
    return 0 
} 

extract_data_verbose() 
{ 
    output=$(extract_data_process $1 2>&1) 
    echo "${output}" 
    return 0 
} 

Perl скрипт:

my $output = `source /path/my_shell-script.sh; extract_data_verbose arg1`; 
Смежные вопросы