Из файла устройства в переменные (как сделать правильно)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
AlexYeCu
Сообщения: 1136
ОС: fedora

Из файла устройства в переменные

Сообщение AlexYeCu »

Есть устройство /dev/ttyUSB0.
В него постоянно сыпятся данные.
Нужно выбирать данные построчно и последним значением подходящей строки обновлять глобальные переменные.
Вроде бы просто. Но!
Конструкция вида

Код: Выделить всё

$(cat /tmp/port_data | grep -i выражение | tail -n1)

Пытается выполнять строки из /tmp/port_data, чего мне, разумеется не нужно.
Каким образом всё это можно экранировать?
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Из файла устройства в переменные

Сообщение Vascom »

Убери доллар и скобки.
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1136
ОС: fedora

Re: Из файла устройства в переменные

Сообщение AlexYeCu »

Vascom писал(а):
08.05.2017 20:19
Убери доллар и скобки.

Так я переменной значение это присваиваю.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Из файла устройства в переменные

Сообщение Bizdelnick »

И где присваивание?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1136
ОС: fedora

Re: Из файла устройства в переменные

Сообщение AlexYeCu »

Bizdelnick писал(а):
08.05.2017 22:49
И где присваивание?

Код: Выделить всё

var=$(cat /tmp/port_data | grep -i выражение | tail -n1)

Так понятней?
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Из файла устройства в переменные

Сообщение Vascom »

Тогда что пытается выполнить строки?
Показывай всё подробнее.
Спасибо сказали:
Аватара пользователя
yoricI
Сообщения: 2345
ОС: gentoo fluxbox

Re: Из файла устройства в переменные

Сообщение yoricI »

Присваивание вроде бы так делается:

Код: Выделить всё

var=`cat /tmp/port_data | grep -i выражение | tail -n1`

И кстати, можно усовершенствовать

Код: Выделить всё

var=`grep -i выражение /tmp/port_data | tail -n1`

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

А что, из порта прямо текстовые данные сыпятся?
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1136
ОС: fedora

Re: Из файла устройства в переменные

Сообщение AlexYeCu »

Vascom писал(а):
09.05.2017 06:27
Тогда что пытается выполнить строки?
Показывай всё подробнее.


Код: Выделить всё

$ cat /tmp/somedata | grep -i value | tail -n1
value: 3874659
$ $(cat /tmp/somedata | grep -i value | tail -n1)
bash: value:: команда не найдена
$ `cat /tmp/somedata | grep -i value | tail -n1`
bash: value:: команда не найдена
$ cat /tmp/somedata
value: 34653786578
temp: slkjgkljgkl
dn: 38756893476
value: 3874659
temp: kdfhgjkdfhg
$


yoricI писал(а):
09.05.2017 07:52
Присваивание вроде бы так делается:

`` и $() означают одно и то же, второй вариант считается более новым. Воможно, там и есть каие-то мелкие нюансы, но не в данном случае.

yoricI писал(а):
09.05.2017 07:52
А что, из порта прямо текстовые данные сыпятся?


Ага. В примере выше я просто ручками аналог сделал. Если интересно, то это китайский клон ардуины с датчиками шлёт.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Из файла устройства в переменные

Сообщение Bizdelnick »

AlexYeCu писал(а):
09.05.2017 00:03
Bizdelnick писал(а):
08.05.2017 22:49
И где присваивание?

Код: Выделить всё

var=$(cat /tmp/port_data | grep -i выражение | tail -n1)

Так понятней?

Да, так понятней. И так ничего выполняться не должно, по крайней мере в наиболее распространённых шеллах. Если у Вас какая-то экзотика, попробуйте так:

Код: Выделить всё

var="$(cat /tmp/port_data | grep -i выражение | tail -n1)"
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1136
ОС: fedora

Re: Из файла устройства в переменные

Сообщение AlexYeCu »

Bizdelnick писал(а):
09.05.2017 11:45
Да, так понятней. И так ничего выполняться не должно, по крайней мере в наиболее распространённых шеллах. Если у Вас какая-то экзотика


Код: Выделить всё

$ "$(cat /tmp/somedata | grep -i value | tail -n1)"
bash: value: 3874659: команда не найдена


Уже лучше, но всё равно выполнить пытается. У меня bash, для данной задачи не принципиально, т.е. могу хоть zsh, хоть ksh использовать.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Из файла устройства в переменные

Сообщение NickLion »

AlexYeCu
Так потому, что вы ничего не присваиваете, а пытаетесь выполнить.
var=$(cat /tmp/somedata | grep -i value | tail -n1)
Так не будет ничего выполнять. Есть команда присвоить переменной var значение.
$(cat /tmp/somedata | grep -i value | tail -n1)
А так, результат интерпретируется как команда, которую и пытается исполнить интерпретатор.
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1136
ОС: fedora

Re: Из файла устройства в переменные

Сообщение AlexYeCu »

NickLion писал(а):
09.05.2017 12:47
Так потому, что вы ничего не присваиваете, а пытаетесь выполнить.

Вообще-то как раз присваиваю.
Так не будет ничего выполнять.

Ещё как будет. Об этом и вопрос, собственно.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Из файла устройства в переменные

Сообщение NickLion »

AlexYeCu писал(а):
09.05.2017 14:08
NickLion писал(а):
09.05.2017 12:47
Так потому, что вы ничего не присваиваете, а пытаетесь выполнить.

Вообще-то как раз присваиваю.

Вообще-то нет:
$ $(cat /tmp/somedata | grep -i value | tail -n1)
Тут явно идёт выполнение результата $().

AlexYeCu писал(а):
09.05.2017 14:08
Так не будет ничего выполнять.

Ещё как будет. Об этом и вопрос, собственно.

Не будет ничего исполнять, вот смотрите:

Код: Выделить всё

nicklion@thaumaturge:~> var=$(echo uname)
nicklion@thaumaturge:~> echo $var
uname
nicklion@thaumaturge:~> $(echo uname)
Linux
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1136
ОС: fedora

Re: Из файла устройства в переменные

Сообщение AlexYeCu »

NickLion писал(а):
09.05.2017 14:22
Не будет ничего исполнять, вот смотрите:

А если ту же строчку поместить в скрипт?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Из файла устройства в переменные

Сообщение Bizdelnick »

AlexYeCu
Шелл сначала подставляет значения переменных и конструкций вроде $() и ``, а потом интерпретирует получившуюся строку. Поэтому строка вида $(command) превратится в то, что command выдаст на stdout, а потом будет выполнена как команда. Строка же вида var=$(command) превратится в var=то_что_выведет_command, и переменной будет присвоено сооответствующее значение.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Из файла устройства в переменные

Сообщение NickLion »

Код: Выделить всё

nicklion@thaumaturge:~> cat a.sh
#!/bin/bash

var=$(echo uname)
echo $var

nicklion@thaumaturge:~> ./a.sh
uname
Спасибо сказали:
Ответить