LINUX.ORG.RU

Передача в функцию строки и выполнение этой же строки.

 , ,


0

1

Добрый день! У меня такая проблема: Нужно передать в функцию строку и выполнить эту строку. Вот пример:

#!/bin/bash

foo(){
 eval "${1} &"
 #other code
 #....
}

tempfile=`mktemp`
foo "whiptail --title \"Enter work directory\" --clear --inputbox \"\" 8 50 \"some text\" 2> ${tempfile}"
rm -f ${tempfile}

Проблема в том, что eval получает такую строку:

whiptail --title '"Enter' work 'directory"' --clear --inputbox '""' 8 50 '\"some text"' '2>' /tmp/fileLkAOGC
и выполняет такую:
whiptail --title 'Enter work directory' --clear --inputbox '' 8 50 'some text'

Собственно, мне нужно что б выполнялась строка:

whiptail --title 'Enter work directory' --clear --inputbox '' 8 50 'some text' 2> /tmp/fileLkAOGC

Проблему решил таким способом:

#!/bin/bash

foo(){
 eval "${1} &"
 #other code
 #....
}

tempfile=`mktemp`
foo "whiptail --title \"Enter work directory\" --clear --inputbox \"\" 8 50 \"some text\"" && 2> ${tempfile}
rm -f ${tempfile}

RedEyer
() автор топика
Ответ на: комментарий от emulek

Если делать так, как вы спрашиваете, то #other код будет выолняться только после того, как выполниться

eval "${1}"
. если писать так :
eval "${1} &"
то всё будет как положено, строка ${1} будет выполняться в фоне.

Кстати, я думал что задача решена. Но оказалось что нет, по этому вопрос актуален..

RedEyer
() автор топика
Ответ на: комментарий от RedEyer

Если делать так, как вы спрашиваете, то #other код будет выолняться только после того

дык subshell сделайте.

( eval "$1" )&
ну или всю функцию foo() отправьте в фон.

В любом случае, вставлять такое в eval плохо. Как и вообще сам eval. Почему нельзя было выполнить команду прямо в foo() (передав параметры через $@)?

Вангую, что вы сами себе сложности создали, а теперь их решаете.

emulek
()
Ответ на: комментарий от emulek

Простите, а чем вы аргументируете выражение «В любом случае, вставлять такое в eval плохо. Как и вообще сам eval.»?

«Вангую, что вы сами себе сложности создали, а теперь их решаете.» Возможно вы и правы на этот счет, но другого решения я не нашел.

PS: Передавать команду и выполнять её через $@ не получается. Возможно я что-то упускаю. По этому приведу более реальный пример(Он рабочий) Суть задачи: нужно перерисовывать псевдографический интерфейс(команда whiptail, если не знаете)при изменении размеров эмулятора терминала.Перерисовывать нужно до закрытия этого интерфейса. Пожалуйста, не спрашивайте зачем мне это нужно. Собственно код:

#!/bin/bash
redraw_dialog(){
		local COMMAND="$1 &"
		local hight=`tput lines`
		local width=`tput cols`
		local count=0
		if [ "$2" != "" ]; then
			eval ${COMMAND} 2> $2
		else
			eval ${COMMAND}
		fi
		local PID=$!
		while (true);do

			if [ "`pgrep "whiptail"`" != "" ]; then

				if [ $hight != `tput lines` ]; then
					hight=`tput lines`
					kill $PID
					wait $PID
					if [ "$2" != "" ]; then
						eval ${COMMAND} 2> $2
					else
						eval ${COMMAND}
					fi
					PID=$!
				
				elif [ $width != `tput cols` ]; then
					width=`tput cols`
					kill $PID
					wait $PID
					if [ "$2" != "" ]; then
						eval ${COMMAND} 2> $2
					else
						eval ${COMMAND}
					fi
					PID=$!
				fi
			
			fi
			
			#if whiptail ran set count
			if [[ "`pgrep "whiptail"`" != "" && $count = "0" ]]; then
				count="1"
			fi
			#if whiptail was run and then was closed break
			if [[ "`pgrep "whiptail"`" = "" && $count = "1" ]]; then
				break
			fi

			sleep 0.5
		done
		wait $PID
		STATUS=$?
		reset
}

file=`mktemp`
redraw_dialog "whiptail --title \"Example\" --clear --inputbox \"\" 8 50 \"BlaBlaBla\" "  $file
#Проверяем. что была произведена запись в файл
echo "cat "
cat $file
echo ""
rm -f $file
нужно в одно случае предавать такую строку:
whiptail --title \"Example"\" --clear --inputbox \"\" 8 50 \"BlaBlaBla\" 2> $file

RedEyer
() автор топика
Ответ на: комментарий от RedEyer

Простите, а чем вы аргументируете выражение «В любом случае, вставлять такое в eval плохо. Как и вообще сам eval.»?

довольно нелепо аргументировать азбучные истины. Eval это в любом случае потенциальная дыра в безопасности, т.к. очень сложно контролировать, ЧТО именно будет выполняться _кроме_ того, что вы хотели сделать. Особенно в случае, если это выполняется отдельным процессом параллельно. Конечно это ваш код, и вы можете положить с прибором на всё это. Мне всё равно.

Суть задачи: нужно перерисовывать псевдографический интерфейс(команда whiptail, если не знаете)при изменении размеров эмулятора терминала.Перерисовывать нужно до закрытия этого интерфейса. Пожалуйста, не спрашивайте зачем мне это нужно.

не буду. Спрошу другое: зачем выполнять $COMMAND в отдельном процессе параллельно с остальным кодом? Вот это мне совсем непонятно, смысл в таких сложностях?

emulek
()
Ответ на: комментарий от emulek

Я решил выполнять $COMMAND в отдельном процессе для того, что бы пока выполняется $COMMAND проверять размеры терминала.

PS: Думаю, что стоит закрывать этот диалог.

RedEyer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.