Na GOG.com běží Spring Sale. Při té příležitosti lze získat zdarma počítačovou hru Deep Sky Derelicts.
Sound Open Firmware, projekt Linux Foundation, open source audio DSP firmware a SDK, byl vydán ve verzi 2.5.0. Přináší podporu platformy Mediatek mt8188 nebo nový audio modul ARIA (Automatic Regressive Input Amplifier Module).
Byla vydána nová verze 5.8 programovacího jazyka Swift (Wikipedie). Zdrojové kódy jsou k dispozici na GitHubu. Ke stažení budou oficiální binární balíčky pro Ubuntu 18.04, Ubuntu 20.04, Ubuntu 22.04, CentOS 7, Amazon Linux 2 a Red Hat Universal Base Image 9.
Byla vydána nová verze 1.77 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.77 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Byla vydána beta verze Ubuntu 23.04 s kódovým názvem Lunar Lobster. Přehled novinek v poznámkách k vydání. Dle plánu by Ubuntu 23.04 mělo vyjít 20. dubna 2023.
Linuxová distribuce OpenMandriva byla vydána ve verzi ROME 23.03. Název ROME říká, že se jedná se o průběžně aktualizovanou (rolling) edici. Stabilní edice nese název Rock, aktuálně OpenMandriva Lx 4.3 Dysprosium.
Tento pátek od 14:00 proběhne v Brně na FI MUNI konference DevConf Mini. Na programu je celá řada zajímavých přednášek od testování releasů Fedory, přes super počítače nebo Big Data, až po závody autonomních aut. Konferenci bude možné sledovat i na online streamu.
Minulý týden proběhla hackerská soutěž Pwn2Own Vancouver 2023. Adobe Reader, Microsoft SharePoint, Oracle VirtualBox, Tesla, Ubuntu Desktop, Windows 11, macOS, Microsoft Teams, VMWare Workstation. Vše hacknuto. Synacktiv získal 530 000 dolarů a Teslu Model 3.
Byla vydána nová stabilní verze 3.5 svobodného 3D softwaru Blender. Přehled novinek i s náhledy v oznámení o vydání a na YouTube.
Po 5 měsících vývoje od vydání verze 6.1 byla vydána nová verze 6.2 svobodného open source redakčního systému WordPress. Kódové jméno Dolphy bylo vybráno na počest amerického jazzového altsaxofonisty, flétnisty a basklarinetisty Erica Dolphyho.
Kopie root@vzdalenypocitac cp /adresar/soubor /cilNo a potřeboval bych napsat skript, který to projde a na vzdáleném PC spustí daný příkaz. Skript napsaný níže by fungoval, kdyby... - když to nechám takto použije read standardní oddělovač a v proměnné $command mám jen "cp" namísto "cp /adresar/soubor /cil" - když definuju proměnnou IFS=";" (a použiju v cfg souboru jako oddělovač ;), tak to píše chybu: ./sript.sh: line 45: ssh root@vzalenypocitac: command not found Poradí někdo co s tím? (Netrvám na použití příkazu read, nic lepšího jsem ale stvořit nedokázal. Ve smyčce cyklu se toho bude provádět více (další dotazy, kontrola))
#!/bin/bash Config=${0%.*}.cfg echo $Config #IFS=; grep -v "^#" $Config | while read label remoteuser command do echo $label sshcmd="ssh $remoteuser" cmd="$($sshcmd $command; exit)" done
Řešení dotazu:
Kopie root@vzdalenypocitac "cp /adresar/soubor /cil"
IFS=';'
, zkuste si dát IFS=' '
před cmd="$($sshcmd $command; exit)"
.
…samozřejmě to nevyřeší zadání, jen to provede první řádek…
IFS=";"
, ale ve skriptu máte IFS=;
(navíc zakomentované), což udělá něco úplně jiného. Takže pokud chcete poradit, dejte sem skript, vstup a chybovou hlášku, které si odpovídají. Nemusejí to samozřejmě být ostrá (a citlivá) data, ale mělo by to být něco, na čem lze chybu reprodukovat.
while read line; do set -- $line label="$1" remoteuser="$2" shift 2 command="$*" ... done < $Config
#!/bin/bash Config=1.cfg #IFS=";" grep -v "^#" $Config | while read label remoteuser command2 command3 do command="mkdir /test" echo $command echo $command2 echo $command3 sshcmd="ssh $remoteuser" cmd1="$($sshcmd $command; exit)" cmd2="$($sshcmd $command2; exit)" cmd2="$($sshcmd $command3; exit)" doneA mám dva konfigurační soubory ve stejném adresáři (1.cfg oddělený tabulátory, 2.cfg oddělený středníky), ale oba obsahují stejná data:
uloha1 root@vzdalenypocitac touch /test/test.txt cp /test/test.txt /test/test_copy.txtKdyž použiju Config=1.cfg a zakomentuju $IFS=";", tak se sice načtou proměnné command2 a command3 špatně, ale aspoň ten natvrdo napsaný $command (mkdir /test) se provede:
mkdir /test touch /test/test.txt cp /test/test.txt /test/test_copy.txt touch: missing file operand Try `touch --help' for more information. bash: /test/test.txt: No such file or directoryKdyž použiju Config=2.cfg a použiju $IFS=";", tak mám sice nádherně načtené proměnné ze souboru, ale nic se neprovede. Nic!
mkdir /test touch /test/test.txt cp /test/test.txt /test/test_copy.txt ./dotaz.sh: line 11: ssh root@cz-brn1-ssm: command not found ./dotaz.sh: line 12: ssh root@cz-brn1-ssm: command not found ./dotaz.sh: line 13: ssh root@cz-brn1-ssm: command not foundA nepomůže ani, když v konfiguračním souboru dám jednotlivé řetězce do uvozovek, když nedefinuju IFS, tak to bere za oddělovače i mezery uvnitř uvozovek. Takže otázka je pořád stejná. Když nedefinuju $IFS, tak čtu špatně soubor. Když definuju $IFS, tak se mi v cyklu odmítá cokoli spustit (dokonce i mimo cyklus)! Co s tím? PS: Ten druhý způsob cyklu s read jsem už taky zkoušel. Chovalo se to stejně. Navíc jsem nevěděl jak se zbavit řádků s komentáři...
while read line; do ... done < $Config
#!/bin/bash Config=1.cfg OLDIFS="$IFS" MYSEP=';' IFS="$MYSEP" grep -v "^#" $Config | while read label remoteuser command2 command3 do command="mkdir /test" echo $command echo $command2 echo $command3 sshcmd="ssh $remoteuser" #nejpozději tady IFS="$OLDIFS" cmd1="$($sshcmd $command; exit)" cmd2="$($sshcmd $command2; exit)" cmd2="$($sshcmd $command3; exit)" IFS="$MYSEP" done
Ach jo. To je opravdu tak těžké pochopit, že pro řešení problému je potřeba ukázat, jak vypadá konfigurační soubor, se kterým máte problémy, ne ten, se kterým je nemáte?
Takže otázka je pořád stejná. Když nedefinuju $IFS, tak čtu špatně soubor. Když definuju $IFS, tak se mi v cyklu odmítá cokoli spustit (dokonce i mimo cyklus)! Co s tím?
Místo tučného písma a vykřičníku raději poskytněte informace potřebné k řešení. Takhle můžu jen hádat, jeden problém by mohl být v tom, že když nastavíte proměnnou IFS
takhle, tak (1) ovlivní úplně všechno, co dělá váš shell a co závisí na její hodnotě, tj. i v té příkazové substituci a (2) jen shodou okolností se vůbec aplikuje na ten příkaz read
. Proměnná IFS
je nebezpečná hračka a měla by se nastavovat jen tam, kde to opravdu potřebujete, tj.
egrep -v '^#' $config | while IFS=';' read label target cmd2 cmd3; do
Další problém, na který narazíte vzápětí, je, že všechno, co je v těle cyklu, tedy i ssh, zpracovává stejný standardní vstup jako read
, takže se ve výsledku zpracuje jen první řádek. Dá se to obejít různě, např. tak, že všemu, co by mohlo něco číst ze vstupu (např. tomu ssh) přesměrujete vstup z /dev/null
. Nebo si lze pomoci trikem
exec 3< <(egrep -v '^#' $config) while IFS=';' read label target cmd2 cmd3 <&3; do
Na vašem místě bych si ovšem nekomplikoval život, konfigurační soubor by vypadal takto
job1 mike@host1 id ; df -h / ; w -f job2 root@host1 id ; w -f job3 root@host2 id ; w -f ; df -h
a skript takto
#!/bin/bash egrep -v '^#' cmds | while read label target cmd; do out=`ssh $target "$cmd" </dev/null` echo -e "job $label:\n$out" done
Tiskni
Sdílej: