перенаправление потока и переменная окружения (непонятно себя ведут)

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

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

Ответить
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

перенаправление потока и переменная окружения

Сообщение sash-kan »

перенаправляю вывод команды в файл:

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

$ ping > /dev/null
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
            [-M mtu discovery hint] [-S sndbuf]
            [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
$
все правильно и логично - синтаксис команды неверен.
а теперь засовываю предыдущую команду в переменную окружения и вызываю:

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

$ A="ping > /dev/null"
$ $A
ping: unknown host >
$
т.е. явный бред. почему не сработало перенаправление, а строка "> /dev/null" была воспринята как аргумент? это bash такой кривой или я чего-то не допонимаю?
p.s. было опробовано на разных дистрибутивах с разными версиями bash.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: перенаправление потока и переменная окружения

Сообщение Jan2ary »

Все он правильно делает. Ты же делаешь то же самое, только из переменной A.
А какая цель?
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Nab
Сообщения: 257
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение Nab »

Очень интересный факт, наверно интерпретацию перенаправления он делает только на самом верхнем уровне... думаю точнее надо помотреть в документации....

Но если серьезно, а не чисто теоретически, то приведите мне пример где это нужно?
Ниразу нигде такой конструкции не встречал :(

Jan2ary Подразумевалось именно тоже самое, а он отдает символ перенаправления '>' как параметр команде ping а не обрабатывает его сам...
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение alv »

думаю, нужно для того, чтобы при команде ping без аргументов хелп не выводился
кстати, попробовал заменить на строгие кавычки - результат тот же самый
Спасибо сказали:
Аватара пользователя
shark3D
Сообщения: 37
ОС: Gentoo Linux

Re: перенаправление потока и переменная окружения

Сообщение shark3D »

Дело в том, что BASH воспринимает строку в кавычках как команду и её аргументы и не воспринимает там свои управляющие символы. Для использования перенаправления:

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

$ A="ping аргументы"
$ $A > /dev/null
Кто владеет ИНФОРМАЦИЕЙ - тот владеет МИРОМ
Спасибо сказали:
Nab
Сообщения: 257
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение Nab »

alv писал(а):
04.05.2006 14:53
думаю, нужно для того, чтобы при команде ping без аргументов хелп не выводился
кстати, попробовал заменить на строгие кавычки - результат тот же самый

А help будет выводиться по любому, он в поток ошибок я понял выводиться....
нужно так писать
ping 2> /dev/null

shark3D Все понимают как это исправляется, вопрос почему bash не парсит команду как предполагается ?...
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение alv »

Nab писал(а):
04.05.2006 15:03
А help будет выводиться по любому

да, не подумал
тогда остается дождаться sash-kan, что он обьяснил, для чего это нужно
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение sash-kan »

сам приведенный в первом посте пример немного утрирован для простоты изложения.
(alv @ May 4 2006, в 14:08) писал(а):для чего это нужно

для вполне реального применения. на роутере.
в переменной содержится команда для получения по сети некоего списка.
типа:

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

LIST="wget host/some_list"
этот список затем используется.
но возможна ситуация, когда нужная сеть и, соответственно, host - недоступны. wget в этом случае _очень_ надолго задумывается. и опция -T не помогает.
возникла мысль добавить перед wget-ом команду ping:

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

ping -c 3 host &>/dev/null && wget ...

если всю эту команду выполнить явно - нет проблем. а вот если внутри переменной, то перенаправления не происходит, и в начале списка оказывается гора мусора, созданного пингом.
вот в связи с чем и был задан вопрос.
ситуация, конечно, не смертельная. пришлось слегка отказаться от элегантности. но сам факт настораживает. почему перенаправление не работает?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: перенаправление потока и переменная окружения

Сообщение router »

sash-kan
Насколько помню, shell просматривает полученную строку на предмет обнаружения своих управляющих символов _один_раз_
Во избежание бесконечных циклов или чего-то ещё - не помню.
Поэтому в данном случае оболочка подставила в строку всесто $A ping > /dev/null и посчитала свою задачу выполненной.

добавлено:
Зря я сказал "shell". Следовало бы "bash"
Спасибо сказали:
Аватара пользователя
polachok
Бывший модератор
Сообщения: 2199
Статус: главный форумный маргинал
ОС: gnu/linux
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение polachok »

[polachok@darkstar ~]# echo $0 [tty06-18:32]
tcsh
[polachok@darkstar ~]# setenv A "ping > /dev/null"
[polachok@darkstar ~]# $A [tty06-18:32]
usage: ping [-AaDdfnoQqRrv] [-c count] [-i wait] [-l preload] [-M mask | time]
[-m ttl] [-P policy] [-p pattern] [-S src_addr] [-s packetsize]
[-t timeout] [-z tos] [-G sweepmaxsize ] [-g sweepminsize ]
[-h sweepincrsize ] host
ping [-AaDdfLnoQqRrv] [-c count] [-I iface] [-i wait] [-l preload]
[-M mask | time] [-m ttl] [-P policy] [-p pattern] [-S src_addr]
[-s packetsize] [-T ttl] [-t timeout] [-z tos] mcast-group
И немедленно выпил.
Спасибо сказали:
Nab
Сообщения: 257
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение Nab »

Угу, к примеру мой ASH тоже себя нормально ведет, я думаю это фирменная фича BASH'а

у меня SHELLVERS=ash 0.2a
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: перенаправление потока и переменная окружения

Сообщение router »

Держите решение для bash

Или, как вариант,

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

A='eval ping > /dev/null'
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение sash-kan »

спасибо всем ответившим, особенно router за предложенный обходной путь.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Nab
Сообщения: 257
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение Nab »

Вот наконец то разобрался с ошибкой которая не давала нормально окончить работу... :angry:
Посыпаю голову пеплом :blink: таки сам натолкнулся на такой же эффект...
просто там скрипт большой и думал что ошибка в другом оказалось вот что....

есть вот такой код:

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

write() { echo $3 >> $1.$2.log }
как часть большого скрипта.

Так вот BASH отрабатывал нормально, а мой ASH выдавал ошибку на незакрытую фигурную скобку....

Так как код этот был внутри другой кнструкции и в середине большого скрипта, то я долго грешил на используемый чуть ранее awk :wacko:

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

sash-kan спасибо за тему, как нельзя кстати :)
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение madskull »

Nab писал(а):
11.05.2006 05:35
А вот сейчас перерабатывая опять этот скрипт вспомнил о этом топике...
достаточно было снести закрывающую фигурную скобку на новую строку как все стало тип-топ...

Или поставить точку с запятой перед закрывающей скобкой

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

write() { echo $3 >> $1.$2.log;}

(По сути, "\n" и ";" - одно и то же)
ArchLinux / IceWM
Спасибо сказали:
Nab
Сообщения: 257
Контактная информация:

Re: перенаправление потока и переменная окружения

Сообщение Nab »

madskull писал(а):
11.05.2006 10:20
Или поставить точку с запятой перед закрывающей скобкой

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

write() { echo $3 >> $1.$2.log;}

(По сути, "\n" и ";" - одно и то же)

Сенкс, именно так теперь и будет работать... :)
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Ответить