LINUX.ORG.RU

BASH: передать весь ввод в скрипт в виде аргументов.

 , ,


0

2

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

например:

eix -S "ololo trololo"

передаётся без кавычек.

etc-update && emerge -pv =dev-python/python-exec-0.3.1

передаётся коряво, то есть действие скрипта заканчивается на амперсандах.

emerge -av portage gentoolkit layman eix gentoo-sources python ololo trololo и ещё много чего

передавать как? ведь слишком много аргументов.

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

//тег генты здесь потому, что, дядьки, вы же не бросите меня с этой фигнёй, правда? ^_^

Ответ на: комментарий от a1batross

мне придётся экранировать до передачи в скрипт, но тогда это будет ещё сложнее, чем без скрипта.

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

я всё пробовал, и кучу документации перечитал, но нифига не нашёл, или плохо искал, искал не то, не там, не так.

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

Ввод передаётся в скрипт в виде аргументов (в данном случае echo). Лень было делать отдельный скрипт. Ну раз уж надо:

$ <<EOF cat | ((echo '#!/bin/sh'; echo '`cat`') > test.sh; sh test.sh)
echo 123 "test fff"
EOF
123 "test fff"

Как видно команда echo передаётся скрипту. Тут же выполняется и все кавычки на месте.

ziemin ★★
()

$IFS, set —

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

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

благодарю.

funeralismatic ★★★
() автор топика

Выдать результат работы скрипта в качестве аргументов? Вот (полезно для обновления KDE, qt...):

$ emerge -pv `qlist -IC kde/*`
# Или, аналогично
$ emerge -pv $( qlist -IC kde/* )

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

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

whatever_program "$@"? Кавычек программа не увидит, а все аргументы будут переданы в том же виде, в котором достались скрипту.

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

без кавычек скрипт не имеет никакого смысла.

например

eix -S ololo trololo
и
eix -S "ololo trololo"
обрабатывается по разному.

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

это я знаю. манипуляции в рукопашную такие проводятся легко, но в первозданном виде это скрипту передать мне не удавалось пока.

примеры с emerge и eix были только для наглядности желаемого, мне нужно передавать намного больше информации скрипту.

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

но в первозданном виде это скрипту передать мне не удавалось пока.

Тогда это делается через стандартный ввод/вывод.

$ vi script.sh
#!/bin/sh
# Скрипт заключает строки в кавычки

while read STR ; do
        echo "'$STR'"
done

$ chmod +x script.sh
$ zcat /proc/config.gz | ./script.sh
# Profit

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

угу. свиду понятно...

не смог найти свой недоскрипт, восстановлю по памяти позже.

тут вот в чём сложность. скрипту могут передаваться как косые кавычки, так и одинарные, и двойные, плюс они могут быть экранированы вручную.

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

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

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

$ echo 'This "is" very $COMPLEX `echo` string!' | ./script.sh
'This "is" very $COMPLEX `echo` string!'

Ты бы конкретную (а не надуманную) проблему привел бы. А то ты сдался еще и не начав писать что-то, просто размышляя.

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

Если у тебя что-то действительно сложное - да. Но для всяких «помогалок» в строк 300, которые пишутся максимум за час-два, bash'a хватает заглаза.

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

тут дело не в сдался, а ниасилил.

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

суть скрипта проста до невозможности, она должна выполнять всего лишь:

su - -c $(всё -что "угодно" здесь)

sudo ненужно по ряду причин.

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

тут дело не в сдался, а ниасилил.

Мне кажется, что тебе просто нужно начать делать. Если ты предвидишь проблемы - сделай сначала «модельные» участки. А там уже увидишь, есть нам проблемы на самом деле или нет.

она должна выполнять всего лишь:
su - -c $(всё -что «угодно» здесь)

Может я слишком мало спал эту неделю, но я все еще не могу понять что тебе нужно. Можешь дать конкретный пример, без 'всё -что «угодно» здесь', а с реальными данными (или близкими к ним)?

Вот еще:

$ vi script2.sh
#!/bin/sh
# Скрипт читает из stdin код и выполняет его

while read L ; do
        bash -c "$L"
done

$ chmod +x script2.sh
$ echo 'echo -n "Counting: "; for ((C=1;C<10;C++)) ; do echo -n "$C " ; done ; echo' | ./script2.sh
Counting: 1 2 3 4 5 6 7 8 9
$ ./script2.sh 
echo "It works"                                                     
It works
echo -n "Counting: "; for ((C=1;C<10;C++)) ; do echo -n "$C " ; done ; echo
Counting: 1 2 3 4 5 6 7 8 9
Ctrl+D

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

su - -c $(всё -что «угодно» здесь)

Ну дык cat же. Я ж тебе написал. Что, не работает?

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

Вы запускаете script.sh "ololo trololo". Скрипт запускает eix "$@". eix получает _один_ аргумент ololo trololo. Готово.

AITap ★★★★★
()

Я тут перечитал твои посты... Слушай, а тебе это нужно часом не для того, чтобы разрешить через sudo запускать лишь определенны команды?

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