Cygwin mění výpis ze souboru do konzole

Cygwin mění výpis ze souboru do konzole
« kdy: 15. 02. 2024, 16:28:32 »
Zdravím vespolek,
Prosím o nakopnutí s následujícím problémem. V GNU bash, version 5.2.15(3)-release-(x86_64-pc-cygwin) se mění příkazy spouštěné ze souboru cmd.

Příklad1:
do souboru vse4a.cmd je vložen následující řádek:
Kód: [Vybrat]
gawk -F, -v ORS="," '{print $1} END {ORS="\n"; print ""}' >>output2.txt output1.txt
ale při spuštění vse4a.cmd se do konzole vypíše:
Kód: [Vybrat]
gawk -F, -v ORS="," '{print $1} END {ORS="\n"; print ""}'  output1.txt 1>>output2.txt
-prohodi se ">>output2.txt" s "output1.txt" a přidá se " 1" před ">>"

Příklad2:
do souboru vse4a.cmd je vložen následující řádek:
Kód: [Vybrat]
gawk -F, -v ORS="," '{for (i=1; i<=NF; i++) {sub(/_20[1-2][0-9]-.*/,"",$i);sub(/_save.*/,"",$i); print $i}} END {ORS="\n"; print ","}' >>output2.txt output1.txt
ale při spuštění vse4a.cmd se do konzole vypíše:
Kód: [Vybrat]
gawk -F, -v ORS="," '{for (i=1; i; i++) {sub(/_20[1-2][0-9]-.*/,"",$i);sub(/_save.*/,"",$i); print $i}} END {ORS="\n"; print ","}'  output1.txt 0<NF 1>>output2.txt
-přesune(?) a změní se "<=NF" z cyklu for mezi prohozené "output1.txt" , ">>output2.txt" v podobě "0<NF" a před "<<" se vloží " 1"

Co a proč se to děje? Jsou snad některé znaky z cmd souboru vpisované do console brány jako formátovací pro text? (stdin > stdout?)

Pozn: vse4a.cmd vypsaný přes cat je vypsaný v pořádku beze změn.

Předem děkuji za odpověď.
« Poslední změna: 15. 02. 2024, 16:46:42 od Petr Krčmář »


Re:Cygwin mění výpis ze souboru do konzole
« Odpověď #1 kdy: 15. 02. 2024, 17:03:50 »
Je výsledek stejný v původní i změněné podobě?

Re:Cygwin mění výpis ze souboru do konzole
« Odpověď #2 kdy: 15. 02. 2024, 17:50:48 »
můj tip je, že výstup bude totožný a ten druhý "předělaný" zápis je nějaká "kanonická" forma zápisu.
Třeba >> a 1>> je oboje přesměrování stdout, a pro "kanonickou formu" se bere ten "jednoznačnější" zápis.

e3k

  • ****
  • 256
    • Zobrazit profil
    • E-mail
Re:Cygwin mění výpis ze souboru do konzole
« Odpověď #3 kdy: 15. 02. 2024, 19:46:45 »
a co sa presne snazis spravt s tym >> output1.txt outpout2.txt? podla mna ide o XY problem.
bash v native linuxe spravi nasledovne:
Kód: [Vybrat]
$ echo "hello world" >> test1.txt test2.txt
$ cat test1.txt
hello world test2.txt
$ cat test2.txt
cat: test2.txt: No such file or directory

Re:Cygwin mění výpis ze souboru do konzole
« Odpověď #4 kdy: 16. 02. 2024, 21:21:19 »
Děkuji za odpovědi. Něco se objasnilo ("kanonická" forma zápisu. Třeba >> a 1>> je oboje přesměrování stdout).

Raději to rozepíši v celku pro případ kdy by chyba byla zavlečena.

Cílem je udělat inventární csv z  Info-lshw.txt ze záloh Clonezillou. Adresáře záloh jsou v formátech:

Kód: [Vybrat]
Kontrola-3a_savepart_2024-01-23-11-img
Sklad_11_2021-10-13-17-img
Vyroba_A_savedisk_2021-10-27-16-img

Script:
Kód: [Vybrat]
gawk -F'\n' -v ORS="," /This/'{print FILENAME} END {ORS="\n"; print " "}' >output1.txt **img/Info-lshw.txt
gawk -F, -v ORS="," '{for (i=1; i<=NF; i++) {sub(/_20[1-2][0-9]-.*/,"",$i);sub(/_save.*/,"",$i); print $i}} END {ORS="\n"; print " "}' >output2.txt output1.txt
gawk -F'[:]' -v RS="*" '/-core/ {print $0}' **/Info-lshw.txt | gawk -F:  -v ORS="," '/product/ {print $2} END {ORS="\n"; print " "}' >>output2.txt

1. Řádek. Do souboru output1.txt se do řádku vloží názvy adresářů se zálohami oddělené čárkou
2. Řádek. Z názvů adresářů z output1.txt jsou vymazány zbytečné informace a zapsán název pracoviště do souboru output2.txt
3. Řádek. Do output2.txt jsou přidány typy MB. Obdobně budou přidávány položky do dalších řádků v output2.txt.

Problém, který mne trápí je, že příkazy ze skriptu při vložení do konzole jeden po druhém se vykonají očekávaným způsobem. Ale když se spustí souborem vse4.cmd je druhý příkaz při výpisu do konzole změněn do nespustitelné formy. viz. příloha



Re:Cygwin mění výpis ze souboru do konzole
« Odpověď #5 kdy: 17. 02. 2024, 00:53:50 »
A proč je to problém?
Jestli se provede správně co se provést mělo, a jenom na konzoli (kam se nakonec nikdo dívat nebude až se to bude pouštět automaticky) vypsalo něco trochu jinak ... nebo se i ten konzolní výstup dál k něčemu používá?

Co je všechno zapnuté aby ten bash vypisoval prováděné příkazy? Jenom set -v?

Pouští to opravdu bash, nebo se to díky příponě .cmd pustí nějakým windows shellem? (to bych teda nečekal, ale vyzkoušel bych jestli změna přípony něco nezmění)

Když se to spustí s přesměrováním stderr do souboru, tak v tom souboru to bude taky špatně?
(tj. např.: vse4a.cmd 2>vse4a.cmd.err.out)

Re:Cygwin mění výpis ze souboru do konzole
« Odpověď #6 kdy: 17. 02. 2024, 18:43:33 »
V čem je problém? Že 2. příkaz se provede tak jak má POUZE když se vloží do konzole ručně. Tzn.: Napíše se do konzole:
gawk -F'\n' -v ORS="," /This/'{print FILENAME} END {ORS="\n"; print " "}' >output1.txt **img/Info-lshw.txt ENTER
gawk -F, -v ORS="," '{for (i=1; i<=NF; i++) {sub(/_20[1-2][0-9]-.*/,"",$i);sub(/_save.*/,"",$i); print $i}} END {ORS="\n"; print " "}' >output2.txt output1.txt ENTER
gawk -F'[:]' -v RS="*" '/-core/ {print $0}' **/Info-lshw.txt | gawk -F:  -v ORS="," '/product/ {print $2} END {ORS="\n"; print " "}' >>output2.txt  ENTER

Jakmile se tyto 3 naprosto totožné příkazy vloží do souboru vse4.cmd a ten spuštěn, změní se ty příkazy při přepisu do konzole.
První změněný příkaz se provede jak má,
Druhý změněný příkaz se neprovede, protože změna způsobí nenalezení souboru.
Třetí příkaz se provede očekávaným způsobem.

Na screenu je to zvýrazněné:
Žlutý rámeček: Všechny tři příkazy ve vse4.cmd
Fialový rámeček: Příkazy z vse4.cmd spuštěny jedem po druhém v konzoli.
Červený rámeček: Spuštěn vse4.cmd - podtrženy jsou rozdíly proti zdroji a je viditelná chybová hláška.

Nastavení bashe je původní z Cygwin

Změnu přípony a přesměrování výstupu vyzkouším v pondělí. Zatím děkuji za tipy.

Re:Cygwin mění výpis ze souboru do konzole
« Odpověď #7 kdy: 17. 02. 2024, 21:37:02 »
> Druhý změněný příkaz se neprovede, protože změna způsobí nenalezení souboru.

no já jenom že tam vidím i změnu podmínky cyklu z "i<=NF" na "i", což podlě mě i podle toho jak jsem si to pustil z ruky způsobí nekonečný cyklus, takže jestli se to tak opravdu provádí tak se nemůže vypsat na konzoli třetí příkaz - prostě na něj nikdy nepříjde řada.

...

A tak jak na to teď koukám mě napadá .. jestli tam něco nezvládlo že to <=NF není přesměrování ze souboru (protože na tom výstupu je vidět vpravo 0<NF, což je podle mě potenciálně ten nenalezený soubor .... bude to tu chybu hlásit i když se založí soubor NF? S jakýmkoli obsahem ... jestli je to tím, tak by mohlo pomoct ty gawk programy nemít na commandline, ale předat je ze souboru přes např. -f vse4.gawk
a to by podle mě mohlo souviset s tím že se to má příponu .cmd. Hádám že se to ve skutečnosti nepouští přes bash. Proč by bash vypisoval "c:\p\..."?

tak jsem si to šel vykoušet do cygwinu

a opravdu, bla.cmd a bla.sh se stejným obsahem dělají něco jiného)