На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
AlexYeCu
Сообщения: 1136
ОС: fedora
Сообщение
AlexYeCu » 08.05.2017 19:17
Есть устройство /dev/ttyUSB0.
В него постоянно сыпятся данные.
Нужно выбирать данные построчно и последним значением подходящей строки обновлять глобальные переменные.
Вроде бы просто. Но!
Конструкция вида
Код: Выделить всё
$(cat /tmp/port_data | grep -i выражение | tail -n1)
Пытается выполнять строки из /tmp/port_data, чего мне, разумеется не нужно.
Каким образом всё это можно экранировать?
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 08.05.2017 22:49
И где присваивание?
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
Vascom
Сообщения: 1699
ОС: Fedora 32
Сообщение
Vascom » 09.05.2017 06:27
Тогда что пытается выполнить строки?
Показывай всё подробнее.
yoricI
Сообщения: 2384
ОС: gentoo fluxbox
Сообщение
yoricI » 09.05.2017 07:52
Присваивание вроде бы так делается:
Код: Выделить всё
var=`cat /tmp/port_data | grep -i выражение | tail -n1`
И кстати, можно усовершенствовать
Код: Выделить всё
var=`grep -i выражение /tmp/port_data | tail -n1`
А вот вызов потом через бакс со скобками.
А что, из порта прямо текстовые данные сыпятся?
AlexYeCu
Сообщения: 1136
ОС: fedora
Сообщение
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
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
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
Сообщения: 1136
ОС: fedora
Сообщение
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
Сообщение
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
Сообщения: 1136
ОС: fedora
Сообщение
AlexYeCu » 09.05.2017 14:08
NickLion писал(а): ↑ 09.05.2017 12:47
Так потому, что вы ничего не присваиваете, а пытаетесь выполнить.
Вообще-то как раз присваиваю.
Так не будет ничего выполнять.
Ещё как будет. Об этом и вопрос, собственно.
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64
Сообщение
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
Сообщения: 1136
ОС: fedora
Сообщение
AlexYeCu » 09.05.2017 14:39
NickLion писал(а): ↑ 09.05.2017 14:22
Не будет ничего исполнять, вот смотрите:
А если ту же строчку поместить в скрипт?
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 09.05.2017 14:45
AlexYeCu
Шелл сначала подставляет значения переменных и конструкций вроде $() и ``, а потом интерпретирует получившуюся строку. Поэтому строка вида
$(command) превратится в то, что command выдаст на stdout, а потом будет выполнена как команда. Строка же вида
var=$(command) превратится в
var=то_что_выведет_command , и переменной будет присвоено сооответствующее значение.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64
Сообщение
NickLion » 09.05.2017 14:50
Код: Выделить всё
nicklion@thaumaturge:~> cat a.sh
#!/bin/bash
var=$(echo uname)
echo $var
nicklion@thaumaturge:~> ./a.sh
uname