переменная остается пустой в скрипте SH

avatar
Dentricky73
1 июля 2021 в 16:33
50
2
0

Захват баннера с помощью curl to variable кажется пустым. когда я удаляю > /dev/null /dev/null 2>&1 вывод записывается на экран, но мне нужно это в var BANNER без экрана, что я делаю неправильно?

 IPS="$(< scandata.dat)"        

 for IP in $IPS;                
 do                             
        TRY1="$(curl -m 2 -s -o /dev/null --head -w "%{http_code}" -X POST "rtsp://$IP:554")"  
        if [ "$TRY1" -eq 200 ]              
                then                                                                                                                                                    
                    BANNER=$(curl -m 2 -v -s rtsp://$IP:554 > /dev/null 2>&1 )  #Error    
                    echo $BANNER &>> FullBanners.txt
        fi
                    if [[ "$BANNER" == *"TEXT"* ]]; then
                        echo $IP &>> TEXT.txt
                    fi          
done        
Источник
Charles Duffy
1 июля 2021 в 16:35
0

Здесь у вас есть некоторые проблемы с синтаксисом - f/e, [ всегда будет давать сбой, если его последний аргумент не ].

Charles Duffy
1 июля 2021 в 16:36
0

Также, в более общем смысле, DontReadLinesWithFor

Charles Duffy
1 июля 2021 в 16:36
0

... и имена переменных, написанные заглавными буквами, зарезервированы для переменных, которые изменяют поведение оболочки или стандартной утилиты - безопаснее использовать имена, содержащие хотя бы один символ нижнего регистра для ваших собственных переменных (например, как for path in "$dir"/*; do безопасно, но for PATH in "$dir"/*; do не позволит вашей оболочке выполнять какие-либо внешние команды). См. pubs.opengroup.org/onlinepubs/9699919799/basedefs/…, имея в виду, что установка обычной переменной оболочки перезаписывает любую переменную среды с таким же именем.

Charles Duffy
1 июля 2021 в 16:40
0

Кроме того, это определенно не скрипт sh. &>> недопустимо в базовой версии sh, например, по крайней мере, если вы имеете в виду, что & подразумевает, что stderr также должен быть перенаправлен - это расширение поддерживается только более новыми оболочками. [[ также не является функцией sh.

Charles Duffy
1 июля 2021 в 16:42
0

Возвращаясь к вашему настоящему вопросу, однако... в > /dev/null /dev/null 2>&1, что вы ожидаете, что второй /dev/null на самом деле сделает? Реальное значение точно такое же, как у /dev/null >/dev/null 2>&1 — это означает, что у вас есть один /dev/null в качестве аргумента для копии curl, а второй /dev/null используется в качестве цели перенаправления.

Dentricky73
1 июля 2021 в 16:47
0

я вырезал настоящий код, чтобы сделать его более читаемым. я сделал несколько ошибок [ "$TRY1" -eq 200 ] и BANNER=$(curl -m 2 -v -s rtsp://$IP:554 > /dev/null /dev/null 2>&1 )

that other guy
1 июля 2021 в 16:51
0

@ Dentricky73 Dentricky73 Это нормально, но, очевидно, вам следует запустить, опубликовать и спросить о поведении вашего измельченного кода.

Charles Duffy
1 июля 2021 в 16:53
0

($(<filename) — это еще одна вещь, которую делает этот код, которая гарантированно работает в bash, но не в sh)

Dentricky73
1 июля 2021 в 17:10
0

Очень странно, что var $TRY1 работает без проблем, я пробовал тот же BANNER="$(curl -m 2 -v -s -o /dev/null "rtsp://$IP:554" > /dev/null 2> &1 )" без везения

KamilCuk
1 июля 2021 в 20:31
0

удалите > /dev/null и -o /dev/null. Сохранить 2>&1

Ответы (2)

avatar
user1934428
2 июля 2021 в 07:21
0

Перенаправление

>/dev/null 2>&1

говорит:

Сначала выбросьте стандартный вывод.

Затем перенаправьте stderr туда, где сейчас находится stdout. Поскольку stdout переходит в /dev/null из-за первого перенаправления, stderr также переходит в /dev/null.

Поэтому ваша переменная остается пустой.

Вы должны были сделать

2>&1 >/dev/null

вместо этого.

avatar
Dentricky73
1 июля 2021 в 21:37
0

не знаю, что я сделал, но изменил

BANNER=$(curl -m 2 -v -s rtsp://$IP:554 > /dev/null 2>&1 )

до

BANNER="$(curl -m 2 -s -o /dev/null --head -w  -X POST "rtsp://$IP:554")"

сделал всю работу за меня. Это должно быть уродливый хак, по крайней мере, он работает (для меня)

Спасибо всем за помощь.