Sziasztok!
Szeretnék időzítve lefuttatni egy parancsot
$echo "hello" | at 12:09
warning commands will be executed using /bin/sh
Nincsen a /bin -en belül sh könyvtár nekem. Ráadásul nem scriptet akarok futtani hanem csak egy echo parancsot!
- 416 megtekintés
Hozzászólások
Bah.
Eszed vagy nem eszed, az "at" a lefuttatandó parancsot mindenképpen egy shellben fogja lefuttatni, de ez így is van jól.
A /bin/sh manapság általában egy symlink szokott lenni a rendszerben lévő alapértelmezett shellre. (bash, vagy amit éppen használsz)
- A hozzászóláshoz be kell jelentkezni
a /bin/sh egy shell.
az echo egy built-in command, tehát *függ attól melyik shell-t használod.
*persze az 'echo' várhatóan mindegyik shell-ben benne van, szóval neked kb mindegy.
De ha mégsem mindegy, akkor az at parancsnak megadhatod, hogy melyik shell-t használja.
A /bin/sh csak a default.
- A hozzászóláshoz be kell jelentkezni
"Nincsen a /bin -en belül sh könyvtár nekem. "
És?
Kereste bárki is (úgy értem, rajtad kívül)?
:(
"Normális ember már nem kommentel sehol." (c) Poli
- A hozzászóláshoz be kell jelentkezni
Az "sh" a /bin könyvtárban levő fájl, nem pedig egy újabb könyvtár. Ez nem windows, ahol a futtatható programoknak .exe kiterjesztés kell a név végére.
Mellesleg a /bin-ben binárisok (futtatható programok) szoktak lenni. Azaz a /bin/sh is egy futtatható program. Egész pontosan egy SHELL, ami parancsértelmező. Az echo parancsot az "sh" nevű SHELL programban megvalósított programkód fogja végrehajtani. Pedig lehetne a /bin -en belül létező különálló "echo" nevű program is. A warning erre a lehetséges 2 eltérő viselkedésre figyelmeztet.
Aztán majd a linux guruk kijavítanak ha baromságot írtam.
- A hozzászóláshoz be kell jelentkezni
Öö..de hiszen ez csak annyit mond, hogy melyik shellt fogja használni a parancs futtatásakor..Ami hasznos olyankor, ha olyasmit futtatnál, amit mondjuk a bash/zsh/egyéb tud értelmezni, a sima sh meg nem.
- A hozzászóláshoz be kell jelentkezni
-
- A hozzászóláshoz be kell jelentkezni
Akkor hogyan kell kiadni a parancsot hogy lefusson?
Ez így hülyeség:
echo `echo "hello"` | at 12:09
- A hozzászóláshoz be kell jelentkezni
echo "commant_to_run" | at 12:09
mert az at-nek pipe-olod a parancsot. az egy más kérdés, hogyha echo "echo hello" | at 12:09 -et írsz, akkor az lefut, de a háttérben, és a usernek mailt küld
4 és fél éve csak vim-et használok. elsősorban azért, mert még nem jöttem rá, hogy kell kilépni belőle.
- A hozzászóláshoz be kell jelentkezni
Lefut a háttérben?De akkor is ki kellene írnia az echo szöveget nem?
- A hozzászóláshoz be kell jelentkezni
> De akkor is ki kellene írnia az echo szöveget nem?
No de hová kellene írnia?
- A hozzászóláshoz be kell jelentkezni
ki is "írja". elküldi levélben
4 és fél éve csak vim-et használok. elsősorban azért, mert még nem jöttem rá, hogy kell kilépni belőle.
- A hozzászóláshoz be kell jelentkezni
-
- A hozzászóláshoz be kell jelentkezni
Egyszerűen le lehetne ellenőrizni hogy lefut e a háttérben ha fájlt hozatunk vele létre.
De hogy kell kiadni a parancsot?
touch aaa | at 12:12
Így hülyeség mert létrehozza az at előtt is a fájlt
- A hozzászóláshoz be kell jelentkezni
Jó volt ez echo, nem kell kihagyni.
echo 'touch aaa' | at 12:12
Esetleg a 'hol'-on lehetne pontosítani:
echo 'touch /tmp/at-test_1212' | at 12:12
- A hozzászóláshoz be kell jelentkezni
Igen, így lefut a háttérben!!
- A hozzászóláshoz be kell jelentkezni
A pipe az egy olyan entitás, amin az őt megelőző program stdout csatornájára ömlő karakterek továbbhaladnak a következő program stdin csatornája felé.
Itt meg ilyen nincs, tehát marhaság+marhaság=marhaság. :-D
Az alábbi sor választ adhat néhány kérdésedre:
echo /bin/bash -c 'touch aaa' |at now+2 minute
- Az echo a stdout-ra írja a parancsot - amit az at majd végrehajt.
- A /bin/bash -c más shell alatt fogja futtatni a -c utáni parancsot.
- Nem történt intézkedés az időzített program esetleges kimenetéről (stdout) és
- a hiba kimenetéről (stderr) - ezért erről levelet fogsz kapni.
- Amiről nem intézkedtünk az a futtatás pontos helye.
- A hozzászóláshoz be kell jelentkezni
Vagy meg is macskásíthatjuk:
echo "/bin/bash -c 'touch aaa'" | at now+2 minute
- A hozzászóláshoz be kell jelentkezni
Őszinte leszek hozád. A 14 éve futó programsor így néz ki:
PutEvent atstartmod $(print /bin/bash -c \'${Program} restart\' |at now+2 minute 2>&1 |awk '/job/ {print $7}')
- A hozzászóláshoz be kell jelentkezni
Ezért most külön büntetést nem szabok ki, de amit az előbb írtál, az az alábbi hibát eredményezi:
$ echo /bin/bash -c 'touch aaa' |at now+2 minute
$ cat /var/spool/mail/teve
...
Subject: Output from your job 15
...
touch: missing file operand
Try 'touch --help' for more information.
- A hozzászóláshoz be kell jelentkezni
Jóvanna! Győztél.
Viszont az echo után nem fontos mindent is megvédeni. Mint látszik a \' éppen elég. (És ezt nem visszavágási célból írtam. ;))
- A hozzászóláshoz be kell jelentkezni
Ahogy írták felettem a /bin/sh minden rendszeren létezik. Linuxon jellemzően egy symlink a default rendszershellre, ami lehet akármilyen POSIX kompatibilis shell, Bash, zsh, dash, vagy amit akarsz. Elvi síkon még nem POSIX kompatibilis is lehet, pl. fish, nushell, stb., de olyat szopás /bin/sh-ra rádrótozni, egy csomó minden nem fog működni.
Sőt, a helyzetet bonyolítja, hogy egyszerre többféle shellt is használhatsz a rendszeren. Pl. symlinkkel beállíthatod, hogy a /bin/sh a dash-ra mutasson, míg a felhasználód alap shelljévé a Bash-t teszed meg (interaktív shell), de a scriptekben #!/bin/zsh segítségével vagy csak egyszerűen terminálban zsh parancsot kiadva futtathatsz dolgokat külön zsh-ban. A legtöbb disztrón viszont a beállított default mindenféle shellre a Bash, ritkábban zsh.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni