abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 21:21 | Nová verze Ladislav Hagara | Komentářů: 0
včera 11:44 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na podporu herní mini konzole a multimediálního centra RetroEngine Sigma od Doyodo. Předobjednat ji lze již od 49 dolarů. Požadovaná částka 20 000 dolarů byla překonána již 6 krát. Majitelé mini konzole si budou moci zahrát hry pro Atari VCS 2600, Sega Genesis nebo NES. Předinstalováno bude multimediální centrum Kodi.

Ladislav Hagara | Komentářů: 0
včera 00:10 | Nová verze

Byla vydána verze 4.7 redakčního systému WordPress. Kódové označením Vaughan bylo vybráno na počest americké jazzové zpěvačky Sarah "Sassy" Vaughan. Z novinek lze zmínit například novou výchozí šablonu Twenty Seventeen, náhledy pdf souborů nebo WordPress REST API.

Ladislav Hagara | Komentářů: 1
6.12. 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 26
6.12. 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 2
5.12. 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 6
5.12. 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 50
5.12. 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 10
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 17
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (23%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 788 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Jiný zápis do souborů v Bash

9.12.2012 22:49 LSD
Jiný zápis do souborů v Bash
Přečteno: 2913×
Ahoj, pokud chci zapsat data do souboru tak to udělám asi takto
echo "Toto uložím do souboru" > /tmp/test.txt

pokud více textu, tak 

echo "Toto uložím do souboru" > /tmp/test.txt
echo "Toto taky uložím do souboru" >> /tmp/test.txt
echo "A toto taky uložím do souboru" >> /tmp/test.txt
Co nevím je, jak uložit nějaká data do souboru když je toho třeba na 500 řádků, to musím napsat každý řádek zvlášť s použitím echa.../printf...? Poradí někdo? Dík

Řešení dotazu:


Odpovědi

9.12.2012 23:08 l4m4
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
(a) Použij here-doc
cat >soubor <<EOF
text
text
...
EOF
(b) použij exec
exec >soubor
Toto je velmi pěkná a silná konstrukce v krátkých skiptech, ale jelikož ovlivňuje globálně stav shellu, tak není moc vhodná v situacích, kdy se má část skriptu/funkce chovat jako prostá funkce (neovliňující globální stav).
9.12.2012 23:16 l4m4
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Ještě bych doplnil třetí možnost: dej tu část skriptu do funkce
foo() {
  echo text
  echo text
  ...
}

foo >soubor
10.12.2012 23:37 Pavel Löbl | skóre: 7 | blog: vadnej_pixel
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Jen pro doplneni cele reseni pomoci exec.
echo "standartni vystup"

# zalohuj stdout
exec 5>&1
# presmeruj stdout do soboru
exec >out.txt

echo "vystup do souboru"
echo "standartni vystup" >&5

# obnov stdout
exec 1>&5

echo "standartni vystup"
martin-ux avatar 9.12.2012 23:22 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
k tomu b) od l4m4 by som este prilozil take c)
script my.out
#ls
...
exit
a vsetok output bude v my.out
..when you do things right, people won't be sure you've done anything at all..
10.12.2012 17:54 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash

Asi nerozumiem, bo na to, aby vase c) platilo, tak by musel byt na to skript pripraveny. To znamena, ze by v nom muselo byt nieco, co berie v uvahu moznost, ze sa ako argument zada cesta k suboru, do ktoreho sa vystup samotneho skriptu zapise. Ale urcite takto nefunguje kazdy skript, vid :

#!/bin/bash

data(){
cat <<_EOF
skript: "$0"
pracovny adresar: "$PWD"
date: "$(date)"
_EOF
}

echo "Viem o argumente: $1 , ale ma vobec nezaujima, takze to dam sem "
data
patrik@thinkpad:~$ bash ./test.bash my.out
Viem o argumente: my.out , ale ma vobec nezaujima, takze to dam sem 
skript: "./test.bash"
pracovany adresar: "/home/patrik"
date: "Mon Dec 10 16:51:18 GMT 2012"

Zadavatel dotazu sa snazi vytvorit vystup, ktory sa presmeruje do suboru.

Ak by ste ale napisal:

skript > my.out

tak mate pravdu v tom, ze to bude v subore zapisane a to funguje vzdy, no stale to nie je odpovedou na dane zadanie. Riesenie s here dokumentom je podla mojho nazoru najidealnejsie, pokial sa nechceme starat aj o distribuciu dalsich suborov ako len samotneho skriptu.

martin-ux avatar 10.12.2012 21:25 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
ono script sluzi na jednu vec:
     script -- make typescript of terminal session
najvhodnejsia odpoved na autorovu otazku je to a).

z toho b) mi prislo vhodne spomenut /viacmenej na okraj/ aj to moje c). do shelloveho scriptu by som ho ale nepouzil, na to je vhodne standardne presmerovanie.
..when you do things right, people won't be sure you've done anything at all..
10.12.2012 21:57 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash

Dik za rozsirenie obzorov, som o tom ani netusil, ze nieco take existuje a v spojitosti s jazykom (pisanim) ako napr. "dame session a pod.", co sa dneska pouziva, je naozaj niekedy zlozite vediet alebo pochopit, co vlastne autor mal na mysli. Vy ste to nepouzil, len mi to tak v prvom momente prislo ( script == skript ale v skutocnosti vo vasom prispevku script != skript ). Takze moja nevedomost a dnesny sposob vyjadrovania urobili svoje. :)

martin-ux avatar 10.12.2012 22:22 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
np. heh, to by zase nenapadlo mna :) jj, dal som to do <pre> tagov na znak vypisu z terminalu.
script sa zide hlavne pri generovani logov/dumpov z FW, konzol a pod.
..when you do things right, people won't be sure you've done anything at all..
10.12.2012 11:53 cronin | skóre: 48
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Dobré je oddeliť údaje - v tomto prípade text - od ich spracovania - v tomto prípade zapísanie do súboru. Takže údaje uložiť do súboru napr. data.txt a v skripte sa ich zapísanie do súboru scrvkne na triviálne
cp /path/to/data.txt /tmp/test.txt
alebo
cat /path/to/data.txt > /tmp/test.txt
pričom neskôr je jednoduché pridať ich predspracovanie, napr.:
cat /pat/to/data.txt | grep -i ... | sed -e ... | cut -f ... | tr -d ... | sort -k ... > /tmp/test.txt
[... a vyhrať dnešné kolo súťaže o najzbytočnejší cat, ja viem. :-)]
12.12.2012 06:26 deadmail
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
cat >subor
Napisat vsetky riadky (alebo vlozit/skopirovat) a na konci na novom riadku CTRL+D (teda koniec suboru/vstupu)
xkucf03 avatar 13.12.2012 00:07 xkucf03 | skóre: 45 | blog: xkucf03
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
když je toho třeba na 500 řádků, to musím napsat každý řádek zvlášť
Nemusíš – klidně můžeš na prvním řádku otevřít uvozovky a ukončit je až na posledním. Akorát se ti nesmí vyskytovat uvnitř textu (tam je escapuješ jako \")
echo "toto je první řádek
normálně pokračujeme dál
tady nějaký text v \"uvozovkách\"
poslední řádek" >  /tmp/test.txt
Případně místo uvozovek můžeš použít apostrofy – podle toho, čeho máš v textu míň – takhle jde krásně zapisovat třeba XML do BASH skriptů. Akorát pozor na $ v případě uvozovek, aby se to neinterpretovalo jako proměnné.
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-Výuka.cz, Nekuřák.net
13.12.2012 12:51 cronin | skóre: 48
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
... Akorát se ti nesmí vyskytovat uvnitř textu (tam je escapuješ jako \") ... ... Akorát pozor na $ v případě uvozovek, ...
Akurát, že je okolo toho veľa "akurát". V prípade 500 riadkov by fakt bolo na mieste oddeliť údaje od ich spracovania. Možno keby sme vedeli, aký problém vlastne riešime, mohli by sme radiť lepšie.
13.12.2012 13:31 Kit
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
LSD se od té doby neozval, tak je to asi jedno.

Pro 500 řádek by se asi vyplatilo je umístit do nějakého souboru a vypsat catem. Heredoc by také nemusel být špatný.
13.12.2012 18:31 cronin | skóre: 48
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Pro 500 řádek by se asi vyplatilo je umístit do nějakého souboru a vypsat catem.
Takto?
13.12.2012 20:40 Kit
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Možná. Možná i bez toho zbytečného cat. LSD položil dotaz a zmizel. Nevíme, co vlastně chtěl. Pokud chtěl třeba generovat HTML, tak bych mu raději doporučil xsltproc.
martin-ux avatar 13.12.2012 20:21 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
no ak chcem pisat 500 riadkov do suboru, tak pouzijem textovy editor ;-)
..when you do things right, people won't be sure you've done anything at all..
13.12.2012 16:23 l4m4
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Ano, takhle si podomácku bastlí heredoc lidi, kteří neznají heredoc...
13.12.2012 17:12 Franta
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Heredoc je něco jako <![CDATA[…]]> v XML – když se člověku nechce escapovat speciální znaky a místo toho ohraničí konec textu nějakou speciální sekvencí. Ale zdaleka ne vždy je to potřeba. Proč to dělat složitě, když to jde jednoduše?

Když jazyk umožňuje mít řetězec v uvozovkách apostrofech na víc řádků, tak to přece není žádné prasení, ale využívání možností jazyka.

Proč by mělo být tohle:
cat <<"EEE"
ahoj $1,
jak to jde?
EEE

cat <<EEE
ahoj $1,
jak to jde?
EEE

read a <<EOF
omfg
omfg
EOF
správnější než tohle:
echo 'ahoj $1,
jak to jde?';

echo "ahoj $1,
jak to jde?";

a="omfg
omfg";
?

Na používání "…" a '…' na více řádků nevidím nic špatného.
13.12.2012 17:49 l4m4
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Proč to dělat složitě, když to jde jednoduše?
S tím souhlasím, proto bych taky uvedené krátké příklady psal
echo -e "ahoj $1,\njak to jde?"
echo -e 'ahoj $1,\njak to jde?'
a=$'omfg\nomfg'
aby se s nimi snáz pracovalo.
13.12.2012 17:54 Franta
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Tohle mi jednodušší nepřijde – interpretovat si v hlavě \n – místo toho na zalomení řádku uvnitř "…" prostě kouknu a vidím, na první pohled.
13.12.2012 18:59 pavel
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Nevíte někdo, jak to udělat v awk? Abych nemusel psát 50 řádků typu:
print nějaký\"html\"řádek
print dalsi\"radek\"
....
13.12.2012 19:39 l4m4
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Možná ti to nepřijde, ale je to tak. Příkaz je na jednom řádku a lze ho libovolně odsazovat. Pro krátké texty ideální.
xkucf03 avatar 14.12.2012 00:48 xkucf03 | skóre: 45 | blog: xkucf03
Rozbalit Rozbalit vše Re: Jiný zápis do souborů v Bash
Pokud je to pár slov a jedno \n, tak možná, ale pro delší texty (i pár řádek) je to dost opruz a nepřehledné.

A hlavně ještě k původnímu dotazu – když tazatel napsal:
echo "Toto uložím do souboru" > /tmp/test.txt
echo "Toto taky uložím do souboru" >> /tmp/test.txt
echo "A toto taky uložím do souboru" >> /tmp/test.txt
tak je nejjednodušším a nejpřímočařejším vylepšením jeho kódu to, že prostě uvozovky neukončí a normálně vkládá konce řádků, pokračuje dál a dál a nemusí je ukončovat a posílat do souboru jednotlivé řádky. Heredoc je samozřejmě taky dobré zmínit, ale v první řadě se hodí vědět, že BASH podporuje víceřádkový text v uvozovkách/apostrofech.
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-Výuka.cz, Nekuřák.net

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.