LinuxForum.Fans
Тема

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

Автор: sunjob 12 сообщений 1670 просмотров
13.07.2020 11:08 #435058

добрый день

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

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

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

спасибо

text

#!/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

исходные

text

bash-3.1.017-i486-2
slackware 12.2
13.07.2020 16:18 #435059

Почему три команды CMD?
И почему вызов маленькими буквами? - В Linux как в Unix регистр имеет значение.

13.07.2020 17:31 · отредактировано #435060

попробуйте перенести код в скрипт... :D

p.s. так-то уже подсказали...

p.s.2

Почему три команды CMD?

потому, что, это, типа, попытка подобрать правильную строку команды
ни одна нормально не отработала

И почему вызов маленькими буквами?

а какими он должен быть?

В Linux как в Unix регистр имеет значение

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

еще раз


надо передать "составную" команду строкой
"исходный вариант команды" - закомментирован
13.07.2020 18:41 · отредактировано #435062

зенитя тут постольку поскольку :о)

проблема заключена в 2х строках


надо передать "составную" команду строкой
"исходный вариант команды" - закомментирован

команда может быть любой, с зенитью или без нее, главное, что она "составная",т.е. содержит в себе всяку хрень, типа параметры в ковычках (включая пробелы), списки, итд... вот это все "счастье" весьма непросто передать простой строкой ... :о)

13.07.2020 20:17 #435063
"sunjob" написал:
команда может быть любой, с зенитью или без нее, главное, что она "составная",т.е. содержит в себе всяку хрень, типа параметры в ковычках (включая пробелы), списки, итд... вот это все "счастье" весьма непросто передать простой строкой ... :о)

А в bash, кажется, нет ограничений на длину строки.
Тот же PATH передаётся длинной строкой.

13.07.2020 21:36 #435064

опять мимо :о)

13.07.2020 22:02 · отредактировано #435065
"sunjob" написал:
команда может быть любой, с зенитью или без нее, главное, что она "составная",т.е. содержит в себе всяку хрень, типа параметры в ковычках (включая пробелы), списки, итд... вот это все "счастье" весьма непросто передать простой строкой ... :о)

Что, трудно написать несколько параметров в одной длинной строке? Так нагляднее будет. И сообщение об ошибке легче будет обработать, перебирая параметры по очереди.
Что мешает? Параметры с включёнными названиями в кавычках.
Отлаживать надо добавляя параметры по одному.

14.07.2020 00:03 · отредактировано #435066
"sunjob" написал:
надо передать "составную" команду строкой

вопрос то в чём?
Надо передать - передавай!
Или русский не родной? Вот из всего написанного совершенно не понятно чего тебе нужно. А уж тем паче попытка изнасилования динозавра (ака Slacware 12!!!!!).
Ты немного сосредоточься, чайку попей, и таки сформулируй вопрос так, чтобы другие понимали чего ты хочешь, а то как в анеке :
"
-Петька пять влево!
-Василий Иваныч, огурцы!
-Что огурцы?
-а что пять влево?"

Параметры в баше передаются как отдельные слова - одно слово один параметр, например:
[console]
script.sh -F 1 Argument
[/console]
три параметра:
-F
1
Argument
если надо как-то обработать префиксы параметров(например -- перед самим параметром), то это всё возлагается на пейсателя скрипта, обрабатывай как умеешь,...
Если тебе нужно передать в скрипт что-то длинное и нечленораздельное ака "шла маша по шосе! ахтунг! нихт шиссе! Ганс фояр!", то это можно передать как строку(массив) или предварительно загнать это нечто в строковую переменную, а потом разобрать её уже в скрипте как знания позволят...
А все входящие в скрипт переменные, самим скриптом обрабатываются как стандартные локальные(для скрипта) переменные ака $1, $2, $3, $@....
вот почитай для развития(там немного проблемная история, но для понимания пойдёт) http://utyatnishna.ru/info/41074/passing-arrays-as-parameters-in-bash
а выглядеть такое будет как-то так:

text

#!/bin/sh
echo $1
echo $2
echo $3
echo $@
echo $#

пример :
[console]
Argument="шла маша по шосе! ахтунг! нихт шиссе! Ганс фояр!"
script.sh -F 1 $Argument
-F
1
шла
-F 1 шла маша по шосе! ахтунг! нихт шиссе! Ганс фояр!
11
[/console]

обрати внимание на то, как баш обрабатывает массив, если его в скрипте вызвать как локальную переменную а не как собсно массив...

вот ещё на почитать https://coderoad.ru/22591272/%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0-%D1%81%D1%82%D1%80%D0%BE%D0%BA-%D0%B2-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-bash-%D1%81-%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%D0%BE%D0%BC

15.07.2020 10:23 · отредактировано #435067

уважаемый, грамазек! пожалуйста, переставайте уже юродсоввать, а?! :о)
кастрируйте лучше свои высказывания (кот.вы тут понаогурцали) ... :о)

а уж мои, пусть так и остануться такими, какие есть (читайте внимательней, вдумчивей и размыслявей) :о)


надо передать "составную" команду строкой
"исходный вариант команды" - закомментирован

а вообще, для всех ... товарищей, кот. без строчки кода (втч и перенесенного) ... посвящается :о)

еще раз, по буквам, по словам, по замыслам...

надо передать "составную" команду строкой

значит - есть эта составная команда, ее надо обернуть в строку и передать в другую команду/скрипт итд

"исходный вариант команды" - закомментирован

воно че! значит есть и еще исходный вариант, который надо было передать, но были ошибки, из-за чего и появился топик...
этот вариант закоментирован (это 100% точный отсыл к конкретному коду...)

ну и естественно, в топике приведен полный код, который рассматривается... (а рассматривается ли?! :о)))

вот и попробуйте, уж не снизойдите... возьмите эту команду и передайте ее строкой...

п.с.
как говориться, "ни знаю ни знаю...", на лоре все сразу поняли!

удачных вам трудовых будней :о)

... и да, я тоже люблю анекдоты... :о) был более интересный вариант анекдота про "приборы"... но и он тут не к месту :о)

за попытку помочь, конечно-же спасибо! но и не надо возбуждаться так, если вы что-то да не поняли или что-то да не так подсказали, что-то не поняв итд...
возьмите, лучше, семью, велосипеды и на природу... это-то поважнее будет и ... поинтересней и полезнее :о)

... и приятных вам выходных :о)

15.07.2020 14:18 #435068
"sunjob" написал:
ну и естественно, в топике приведен полный код, который рассматривается... (а рассматривается ли?! :о)))

вот и попробуйте, уж не снизойдите... возьмите эту команду и передайте ее строкой...

п.с.
как говориться, "ни знаю ни знаю...", на лоре все сразу поняли!

если бы ты потрудился почитать моё сообщение полностью, то увидел бы в ссылках ответ на свой вопрос, более того eval - плохой пример и знающие люди даже показывают как нужно делать...
а лор... что ж ты сюда то полез, раз на лоре всё знают и понимают? Или ты считаешь что местные обитатели лор не читают?

15.07.2020 15:08 · отредактировано #435069

sunjob

Ну возьми перебери строки скрипта в цикле и где есть знаки переноса замени на пробелы склей команду в одну линию.
Будешь обрабатывать символы "\" и "возврат каретки" для раздела команд. Пустые строки игнорируй.

Войдите или зарегистрируйтесь, чтобы ответить.