LINUX.ORG.RU

bash, передача команды строкой

 


0

1

добрый день

надо передать «составную» команду строкой
«исходный вариант команды» - закомментирован
с набегу/нагуглю не разобрался

понимаю, что непонимаю глубинных смыслов башизма :o)

буду благодарен за волшебные пендили, подсказки, ссылки, мымсли идеи (желательно, без особых извращений современного баша)

спасибо

#!/bin/sh
#///////////////////////////////////////////////////////////////////////////////
cmd()
#///////////////////////////////////////////////////////////////////////////////
{
$CMD
}
#///////////////////////////////////////////////////////////////////////////////

cd $TMP
touch test_image.{iso,img,txt}

#
# исходный вариант
#
#zenity \
#--file-selection --save     \
#--filename=dvd.iso          \
#--file-filter="*.iso *.img" \
#--title="Выбор файла"; exit 1


   X=$'\040'
MASK="*.iso *.img"  ; TITLE="Выбор файла"
MASK="*.iso$X*.img" ; TITLE="Выбор$Xфайла"

CMD="\
zenity \
--file-selection --save     \
--filename=dvd.iso          \
--file-filter=*.iso\ *.img  \
--title=Выбор\ файла        \
"

CMD="\
zenity \
--file-selection --save     \
--filename=dvd.iso          \
--file-filter=*.iso$X*.img  \
--title=Выбор$Xфайла        \
"

CMD="\
zenity \
--file-selection --save     \
--filename=dvd.iso          \
--file-filter=$(echo *.iso$X*.img) \
--title=$(echo Выбор$Xфайла)      \
"

cmd

exit 0

исходные

bash-3.1.017-i486-2
slackware 12.2

★★

массивы

CMD=(zenity
--file-selection --save
--filename=dvd.iso
--file-filter="*.iso *.img"
--title="Выбор файла")

$CMD

eval + экранировать спец.символы(кавычки)

CMD="zenity
--file-selection --save
--filename=dvd.iso
--file-filter=\"*.iso *.img\"
--title=\"Выбор файла\""

eval $CMD
anonymous ()
int@sophi /tmp $ ./test.bash 
ls -l
total 2964
drwx------ 2 int  int       60 Jul  8 09:10 emacs1000
drwx------ 2 int  int       40 Jul 10 11:16 mozilla_int0
drwx------ 3 root root      60 Jul  8 09:02 systemd-private-3f2143fd79c540ef9c0ba5627a21525f-systemd-logind.service-SxCBlf
drwx------ 3 root root      60 Jul  8 09:02 systemd-private-3f2143fd79c540ef9c0ba5627a21525f-systemd-timesyncd.service-ZdmLli
drwx------ 2 int  int       40 Jul 10 21:35 Temp-19158f30-d5dd-4098-aa20-ed98d64d3268
drwx------ 2 int  int       40 Jul 10 21:35 Temp-79e1903a-8d57-4cef-b5bf-0fae1d7589a0
-rwxr-xr-x 1 int  int      153 Jul 13 11:49 test.bash
-rw-r--r-- 1 int  int  3030223 Jul 10 22:04 tmp-nfv.xpi

int@sophi /tmp $ cat test.bash 
#!/usr/bin/env bash

set -o errexit
set -o pipefail
set -o nounset

cmd() {
    echo "$@"
    $@ 2>&1
}

main() {
    CMD="ls -l"
    cmd "$CMD"
}

main
zl0y ()

Трудно понять, почему нельзя просто вызывать непосредственно команду с подстановкой в нужных аргументах значения из переменных, но если очень хочется, то красивее и проще сделать массивом, раз уж bash:

#!/usr/bin/env bash

MASK="*.iso *.img"

CMD=(
zenity
--file-selection --save
--filename=dvd.iso
--file-filter="$MASK"
--title="Выбор файла"
)

cmd() {
        "${CMD[@]}"
}

cmd

vodz ★★★★★ ()

спасибо парни, выручили, пнули в нужном направлении :о)

но осталась одно «но», zenity возвращает значение, которое надо поймать... с вызовом «массива» не получается

обычно присвоение было:

RET="$(zenity ...)"

sunjob ★★ ()
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: комментарий от sunjob

если так, без «напряга» сделать «исходный код», то будет немного не то, что ожидается :о)

а что будет?

обратите внимание на window-title & ext-mask

обратил. И что?

zl0y ()
Последнее исправление: zl0y (всего исправлений: 1)
Ответ на: комментарий от vodz

почему нельзя просто вызывать непосредственно команду с подстановкой в нужных аргументах значения из переменных

команда будет передоваться в другую команду, которая будет запускать цикл с выполнением «переданной команды».

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

команды разные, а цикл-задолбайку хочется сделать один на всех :о)

sunjob ★★ ()
Ответ на: комментарий от gremlin_the_red
#!/bin/sh

cmd()
{
echo "ABC"
return 0;
}

RET1=$(cmd)
RET2=$?
echo "RET1=$RET1, RET2=$RET2"

-->

RET1=ABC, RET2=0

p.s.
зинитя, кроме кода возврата еще и строки выдает, если был произведен соотв. выбор :о)

sunjob ★★ ()
Последнее исправление: sunjob (всего исправлений: 4)
Ответ на: комментарий от sunjob

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

Ну то есть две функции zcmd1 и ask_cmd. Не?

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

нет, но вам виднее... :o)
это отдельные команды или «из набора параметров зенити»?

как они помогают отцу русской демократии, в случае «наличности»?

п.с. где-то есть, а где-то нету... ту-ту...

zenity-2.32.1-i486-sl12.2

sunjob ★★ ()
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: комментарий от legolegs

с этим проблем нет!!! как вы «метко» заметили :о)

данная фраза была уточняюще/дополняющим моментом к тому коду, кот. я привел вместе с ней, точнее это был ответ to gremlin_the_red на его неправильные мысли по поводу кода возврата :о)

p.s. ну надо-же нить обсужения держать хвостом по ветру?! :о)

спасибо :о)

sunjob ★★ ()
Последнее исправление: sunjob (всего исправлений: 5)