Nowe posty

Autor Wątek: polecenia basha  (Przeczytany 4345 razy)

emm16

  • Gość
polecenia basha
« dnia: 2008-12-08, 11:56:26 »
mamtakie coś

at 21:30
echo "jest wieczor"
atq CTRL+D
powinno wyświetlić jak będzie 21:30 napis jest wieczór ale coś nie działa to
gdzie jestw tym błąd?

darkdancer

  • Gość
polecenia basha
« Odpowiedź #1 dnia: 2008-12-08, 12:56:08 »
Cytat: emm16
gdzie jestw tym błąd?
Nigdzie nie ma błędu - po prostu wyjście z at nie trafia na okno terminala bo nie jest z nim w żaden sposób związane. Wyjście z programów uruchamianych za pomocą cron/at trafia do użytkownika jako poczta systemowa (przy założeniu, że jest ona używana w systemie). Żeby sprawdzić sobie, że at Cię przypadkiem nie oszukuje możesz dodać coś w stylu:
at 21:30
touch ~/plik_utworzony_przez_at.txt

emm16

  • Gość
polecenia basha
« Odpowiedź #2 dnia: 2008-12-08, 14:23:28 »
aha. w takim razie, jak zrobić takie coś, żeby po podanym czasie w terminalu wyświetlił się jakis napis?

micu

  • Gość
polecenia basha
« Odpowiedź #3 dnia: 2008-12-08, 14:48:02 »
Hej,

Na przykład poleceniem 'wall'.

Pozdrawiam
Micu

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
polecenia basha
« Odpowiedź #4 dnia: 2008-12-08, 15:27:36 »
`wall` to raczej nie to.
Bo tu chyba chodzi o prosty skrypt, który po uruchomieniu poczeka do danej godziny i wyświetli w swoim terminalu napis. A nie roześle wiadomość do wszystkich zalogowanych użytkowników.

Więc najprościej użyć polecenia `date`. Sformatować wyjście tak, by pokazywało sekundy od początku Epoki (`man date`) - tak jest najbezpieczniej, bo operujesz na wiarygodnej liczbie, a nie na tekście. Potem porównywać aktualną liczbę sekund z ilością sekund przypadającą na oczekiwaną godzinę. Jeżeli jest większa lub równa, przerywamy oczekiwanie i wykonujemy polecenia.

Poniżej przykładowy kod - jeżeli jesteś ambitny nie zaglądaj, tylko napisz sam :)
#!/bin/bash

czekajdo="21:30"
czestotliwosc="1"

echo -n "Czekam... "

czas=`date +%s -d ${czekajdo}`
teraz=`date +%s`
while [ $teraz -lt $czas ]; do
  sleep ${czestotliwosc}
  teraz=`date +%s`
done

echo -e "\\nJest wieczór."

exit 0

darkdancer

  • Gość
polecenia basha
« Odpowiedź #5 dnia: 2008-12-08, 16:21:44 »
Cytat: emm16
jak zrobić takie coś, żeby po podanym czasie w terminalu wyświetlił się jakis napis?
Najprościej tak jak już sugerowano wykorzystać polecenia wall (wiadomość dla wszystkich użytkowników) lub write (wiadomość dla pojedynczych użytkowników). Np.:
at 7:50
echo "Nie zapomnij zabrac kanapek do szkoly" | write kamil

micu

  • Gość
polecenia basha
« Odpowiedź #6 dnia: 2008-12-08, 16:28:25 »
Moim zdaniem lepiej jednak w 'at' wykorzystać 'write'/'wall' i dostać wiadomość na wszystkich terminalach, chyba o taki przypominacz chodzi autorowi wątku...

Co do skryptu to wskazówka - zakładamy że czas na maszynie jest stabilny i poprawny, więc można policzyć ile sekund ma spać 'sleep' i tyle poczekać - odpada pętla (i tzw 'busy waiting') :-)

darkdancer - to nie do Ciebie, byłeś szybszy :-)

arctgx

  • Gość
polecenia basha
« Odpowiedź #7 dnia: 2008-12-08, 16:34:08 »
Jeśliby założyć, że adresat w porze wykonania będzie używał iksów, to można wykorzystać okienko Xdialog z wiadomością (lub innego dialogowca, zależnie od upodobań). Ponieważ atd nie jest związane ze środowiskiem graficznym, trzeba wskazać serwer X, na którym ma być to wyświetlone, to znaczy zadeklarować wcześniej zmienną DISPLAY (np. DISPLAY=nr_ip_serwera_X:0.0, na lokalnej maszynie nie powinno być potrzeby podawania IP). Na serwerze X za to trzeba za pomocą xhosta (np. xhost +) umożliwić wyświetlanie klientom spoza niego.

Przy okazji jeszcze: temat nie ma praktycznie nic wspólnego z powłoką poza tym, że  jest środowiskiem do wykonywania. Mi też swego czasu było trudno rozróżnić zadania powłoki, jej wbudowanych poleceń i poleceń z zewnątrz.