@AFAIK

AFAIK

AFAIK
AFAIK

Дата рождения: 12.12.1988

55 я читаю 49 меня читают
626 постов
3740 комментариев
AFAIK
23 Jun 2017

Поинт, хочу странного:
У меня на удаленной машине есть башевская переменная, пусть она будет $USERS и в ней будет массив с юзернеймами.
Есть ли какой-нибудь способ сделать так, чтобы эта переменная появилась у меня на машине?
Самое умное, до чего я дошел, это:

USERS=$(ssh example.com 'echo ${USERS[@]}')

но тогда массив перестает быть массивом.

Есть какие-нибудь идеи?

23 Jun 2017

Есть вероятность, что внутри могут оказаться пробелы и получится как-то вот так:

~$ USERS[0]="afaik a"
~$ USERS[1]="afaik b"
~$ USERS[2]="afaik b c"
~$ echo ${USERS[@]}
afaik a afaik b afaik b c
#okjkv/2 в ответ на /1
23 Jun 2017

c zsh я бы тебе помог :)
Алсо, массив одномерный или двухмерный?

23 Jun 2017

На работе на серверах только баш =) Одномерный.

И я уже думаю, что оставлю просто изначальный вариант, прогоню вывод в цикле for, и буду считать, что в элементах массива недопустимы пробелы. Когда когда-нибудь в будущем появится первый пробел, начну дальше думать =)

#okjkv/5 в ответ на /4
23 Jun 2017

а в чём изначальная задача? Вдруг ты столкнулся с синдромом XY и её надо решать вообще не так? :)

#okjkv/6 в ответ на /5
24 Jun 2017

Может омские линуксоиды знают?

24 Jun 2017

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

#okjkv/8 в ответ на /6
24 Jun 2017

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

#okjkv/9 в ответ на /8
24 Jun 2017

В смысле я по ssh подключаюсь, запускаю скрипт и в той же сессии хочу результат назад получить.

#okjkv/10 в ответ на /9
24 Jun 2017

Всем спасибо, я нашел как можно

~$ typeset -p USERS
declare -a USERS='([0]="afaik a" [1]="afaik b" [2]="afaik b c")'

Виндузятники с жуйка помогли понять где искать.

24 Jun 2017

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

mva@note ~ $  cat /tmp/a.sh
export MOO=foo
mva@note ~ $  echo $MOO; bash /tmp/a.sh; echo $MOO


mva@note ~ $

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

3) для zsh можно было бы по аналогии с этим (сам поймёшь что из этого эмулирует ssh-сессию с запуском скрипта):

localA=(); remoteA=("foo bar" "moo boo" "meow baton" "woof lol"); for ar in ${remoteA[@]}; do echo "::${ar}::"; done | while read tempA; do localA+=("${tempA//::}"); done; for check in ${localA[@]}; do echo "::${check}::"; done

А вот для bash'а у меня пока с наскока не получилось (он не любит внутри цикла апдейтить глобальный массив), но я ещё ковырну

#okjkv/12 в ответ на /10
24 Jun 2017

ну, в общем, видимо, да. В баше - только через двумерный массив, походу...

#okjkv/13 в ответ на /11
24 Jun 2017

Неправильно написал, действительно скрипт сорсистся, и из него вызывается функция.

#okjkv/14 в ответ на /12
24 Jun 2017

а у тебя есть возможность хотя бы локально поставить zsh? :)
а то я уже придумал как сериализовать массив на удалённых машинах, но с локальной десериализацией - баш опять палки в колёса ставит, а на zsh решилось бы легко и просто...

#okjkv/15 в ответ на /11
24 Jun 2017

На той машине, с которой мне нужно, нет.
Но можешь рассказать если хочется, вдруг конвертнусь в zsh =)

#okjkv/16 в ответ на /15
24 Jun 2017

ну, с zsh на локалхосте было бы как-то так:

 ssh andromeda 'remoteA=("foo bar" "moo boo" "meow baton" "woof lol"); remoteS="$(printf "%s:_:_" "${remoteA[@]// /___:::___}")"; remoteS="${remoteS%:_:_}"; echo "${remoteS}"' | read localS; localA=(${(@)${(ps,:_:_,)${localS//___:::___/ }}}); for c in ${localA}; do echo "=== ${c} ==="; done

На andromeda'e — bash.
Далее мы получаем строку со склеенным массивом, далее преобразуем её в массив. После этого for-циклом убеждаемся что все в порядке и массив является массивом :)

#okjkv/17 в ответ на /11
24 Jun 2017

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

#okjkv/18 в ответ на /17
24 Jun 2017

алсо, на bash-стороне можно и без printf, но длиннее :)

#okjkv/19 в ответ на /17
24 Jun 2017

а ещё remoteS="${remoteS%:_:_}"; echo "${remoteS}" можно сократить до echo "${remoteS%:_:_}" ;)

#okjkv/21 в ответ на /17
24 Jun 2017

а с башем - только через временный файл или через альтернативные утилиты (типа awk, sed, python, perl). Ибо, насколько я знаю, ему хер укажешь не юзать сабшелл для циклов, пока явно не запрошено :)

#okjkv/22 в ответ на /21
24 Jun 2017

*с башем на локалхосте

#okjkv/23 в ответ на /22
24 Jun 2017

Спасибо. Я согласен с картинкой выше) постараюсь распарсить.

#okjkv/24 в ответ на /17
24 Jun 2017

ну, я могу объснить каждый шаг если нужно :) Или какой-то конкретный

#okjkv/25 в ответ на /24

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.