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

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

Модератор: /dev/random

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

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

Сообщение AlexYeCu » 08.05.2017 19:17

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

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

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

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

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 08.05.2017 20:19

Убери доллар и скобки.
Спасибо сказали:

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

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

Сообщение AlexYeCu » 08.05.2017 21:27

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

Так я переменной значение это присваиваю.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick » 08.05.2017 22:49

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

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

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

Сообщение AlexYeCu » 09.05.2017 00:03

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

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

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

Так понятней?
Спасибо сказали:

Аватара пользователя
Vascom
Сообщения: 1489
ОС: Fedora 30

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

Сообщение Vascom » 09.05.2017 06:27

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

Аватара пользователя
yoricI
Сообщения: 831
ОС: gentoo fluxbox

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

Сообщение yoricI » 09.05.2017 07:52

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

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

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

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

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

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

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

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

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

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

Сообщение AlexYeCu » 09.05.2017 11:34

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
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick » 09.05.2017 11:45

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
Сообщения: 1104
ОС: fedora

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

Сообщение AlexYeCu » 09.05.2017 12:04

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 » 09.05.2017 12:47

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

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

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

Сообщение AlexYeCu » 09.05.2017 14:08

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

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

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

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

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

Сообщение NickLion » 09.05.2017 14:22

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
Сообщения: 1104
ОС: fedora

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

Сообщение AlexYeCu » 09.05.2017 14:39

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

А если ту же строчку поместить в скрипт?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick » 09.05.2017 14:45

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

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

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

Сообщение NickLion » 09.05.2017 14:50

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

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

var=$(echo uname)
echo $var

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