csh пока l oop в одну строку - PullRequest
0 голосов
/ 19 апреля 2020

Я пытался получить дату, напечатанную для команды ping, чтобы имитировать эффект, аналогичный bash ping 1.1.1.1 -O | while read pong; do echo "$(date): $pong"; done, но пока не смог заставить его работать.

Попробовал следующее на csh оболочка, но не работает: ping 1.1.1.1 -O | while ( 1 ) echo `date` end

Чего мне не хватает? ценим вашу помощь.

Ответы [ 3 ]

2 голосов
/ 19 апреля 2020

Как указал Кит, tcsh довольно ограничен во многих отношениях по сравнению с оболочкой Борна. Но в этом конкретном случае вы можете сделать что-то похожее, передав по выводу, например, sed и добавив в каждую строку дату:

> ping -O 127.0.0.1 | sed "s/^/`date` /"
Sun Apr 19 14:12:28 WITA 2020 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
Sun Apr 19 14:12:28 WITA 2020 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.039 ms
Sun Apr 19 14:12:28 WITA 2020 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.057 ms
Sun Apr 19 14:12:28 WITA 2020 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.056 ms

Помните, что большинство утилит Unix уже работают с каждой строкой, поэтому while l oop для работы с каждой строкой часто не требуется.

0 голосов
/ 20 апреля 2020

Спасибо Кит / Мартин. Да, оба ответа были одинаково хороши.

В пользу других: оба следующих варианта удовлетворяют мою потребность, я могу использовать любой из оболочки csh / t csh, фактически на любой оболочке:

bash -c 'ping 127.0.0.1 -O | while read pong; do echo "$(date): $pong"; done'

ping -O 127.0.0.1 | sed "s/^/`date` /"

0 голосов
/ 19 апреля 2020

Что вам не хватает, так это то, что синтаксис, используемый csh и t csh, далеко не такой общий и гибкий, как синтаксис, используемый bash и другими производными от Борна оболочками.

csh имеет специальный синтаксис для 1-строчных if операторов:

if (condition) statement

, но для циклов ничего подобного не имеет:

% while (1) echo hello
while: Expression Syntax.

и это не позволяет передать вывод команды в al oop.

Если вы должны , используйте csh / t csh для некоторых По этой причине вы можете написать скрипт для инкапсуляции вашего while l oop и направить вывод вашей команды в этот скрипт, или вы можете вызвать процесс sh или bash, чтобы выполнить работу за вас:

csh% bash -c 'ping 1.1.1.1 -O | while read pong; do echo "$(date): $pong"; done'

(я использую csh и t csh, как в интерактивном режиме, так и для сценариев, в течение ряда лет. Моим собственным решением было сначала начать использовать bash для сценариев, и затем полностью отказаться от t csh и использовать bash в качестве моей оболочки по умолчанию. Это что-то вроде кривой обучения, и есть некоторые t c sh функций, которые не так удобны в bash, но я рекомендую его.)

По закону я должен разместить эту ссылку:

https://web.mit.edu/ghudson/info/csh.whynot

...