csh (tcsh) неоднозначное перенаправление вывода при назначении вывода переданных команд с перенаправлением stderr на переменную в скрипте

Я пытаюсь назначить вывод моих переданных команд переменной в сценарии csh.

Команда:

set VAR="`ping $1 2>&1 | grep 'unknown' | cut -b 7-13`"

Однако это не хочет работать. Я получаю расплывчатое «Неоднозначное перенаправление вывода».

Я теряюсь, потому что сама команда работает, когда я набираю ее в терминале, и я вижу текст unknown


person krb686    schedule 03.03.2015    source источник


Ответы (2)


2>&1 недопустимый синтаксис csh. Это работает только для оболочек Bourne.

Чтобы передать как stdout, так и stderr, вы можете использовать оператор |&.

Также обратите внимание, что ping по умолчанию будет работать вечно, вы, вероятно, захотите добавить параметр -c, чтобы ограничить количество запусков.

set VAR="`ping localhost -c 5 |& grep 'unknown' | cut -b 7-13`"
person Martin Tournoij    schedule 03.03.2015
comment
Итак, моя проблема заключается в том, что следующие команды, которые должны передаваться по конвейеру, не работают. Я могу изменить свою команду на ping randomHost -c 5 | grep -o 'apple', и вывод по-прежнему будет стандартным ping: unknown host stuff, предположительно поступающим из stderr из команды ping. Но фактические команды, которые я пытаюсь запустить, не работают, поэтому нет вывода для сохранения в переменной. - person krb686; 03.03.2015
comment
Я подумал, что мне нужно перенаправить stderr на stdout, чтобы эти функции действительно работали, если вывод на консоль поступает из stderr, а конвейер работает только на stdout. По крайней мере, это перенаправление решило мою проблему в bash. - person krb686; 03.03.2015
comment
@ krb686 Верно, вам нужны stdout и stderr, это было неочевидно :-) Для этого вы можете использовать |&. - person Martin Tournoij; 03.03.2015

Если это работает в интерактивном режиме, ваша интерактивная оболочка не csh... что, вероятно, хорошо. Перенаправление stderr в csh использует только >&, но только перенаправляет stderr и stdout вместе в файл.

См. также http://www.faqs.org/faqs/unix-faq/faq/part2/section-9.html

Если цель состоит в том, чтобы выяснить, разрешается ли $1, ping в любом случае является неправильным инструментом. Пытаться

set VAR=`dig +short "$1" || echo unknown`
person tripleee    schedule 03.03.2015
comment
Я совсем забыл, что вы правы, я вхожу с помощью csh, но сразу запускаю привычный bash, теперь и забыл. На данный момент я не уверен, какую оболочку я могу использовать для этого сценария, поэтому я все же хотел бы попытаться заставить его работать на csh, если это возможно. Кроме того, если у вас есть какая-либо информация о том, почему хорошо, что моя интерактивная оболочка не csh, я хотел бы знать. Я прочитал несколько источников, но ищу больше. - person krb686; 03.03.2015
comment
csh использует только ›&, но только перенаправляет stderr на stdout.: >& перенаправляет stderr в файл, вы не можете перенаправить stderr на stdout в csh... - person Martin Tournoij; 03.03.2015
comment
@carpetsmoker А? Может быть, моя формулировка неточна, но то, что вы говорите, тоже неверно. command >& file перенаправляет как stdout, так и stderr в один и тот же файл, поэтому эффективно перенаправляет stderr в stdout, а затем stdout в файл. Извините за небрежное объяснение и спасибо за комментарий; ответ обновлен. - person tripleee; 03.03.2015
comment
Кажется, я ошибся, я думал, что >& перенаправляет только stderr, а не stdout :-/ - person Martin Tournoij; 03.03.2015
comment
Я не знаком с dig, но, похоже, он работает не так, как я ожидал. Я вижу, что он разрешил localhost в IP-адрес с dig +short localhost, но ничего не возвращает, когда я пытаюсь использовать dig +short otherhost, а otherhost явно является именем хоста. Тем не менее, я могу успешно пропинговать otherhost. - person krb686; 03.03.2015
comment
Объявлен ли otherhost в вашем /etc/hosts? Вы получаете лучшие результаты с host otherhost или nslookup otherhost? - person tripleee; 03.03.2015
comment
Тогда используйте один из них. dig удобен тем, что может возвращать результаты в машиночитаемом формате, но если это только для человеческого восприятия, любой из них должен подойти. - person tripleee; 03.03.2015
comment
Для получения дополнительной информации о том, почему вам не следует использовать (t)csh для сценариев, см. 10 основных причин, по которым не следует использовать оболочка C - person fork2execve; 16.03.2015