[Bash] Problem att fånga pipestatus i alias

Permalänk
Hedersmedlem

[Bash] Problem att fånga pipestatus i alias

Så för att underlätta byggande och felsökning har jag gjort ett alias där tanken är att bland annat logga all make-output till fil. Efteråt vill jag däremot göra lite mer saker men bara om bygget gick bra.

Mitt alias är i stil med

alias my_make='first_do_this && make all 2>&1 | tee -a ${my_log_file}; test ${PIPESTATUS[0]} -eq 0 && do_more_stuff'

Problemet jag har är att exit status av make verkar inte påverka om do_more_stuff körs eller ej. jag har kunnat printa PIPESTATUS[0] med echo och sett att den är 1 när det går fel.

Som jag förstår det startas ett subshell när man kör alias men jag tycker det borde gå bra för mig att fånga status när jag gör det inuti mitt alias.
https://unix.stackexchange.com/questions/151202/why-doesnt-pi...

Permalänk
Legendarisk

@Shimonu: Lyckas dessvärre inte återskapa det här. Skapade en first_do_this.sh som standin för din första operation, en makefile som antingen misslyckas eller bara inte gör något, samt pipar vidare som i ditt exempel, och det tycks fungera som förväntat (i Bash 4.3.30), både direkt och som alias:

alias mymake='./first_do_this.sh && make all 2>&1 | tee -a log.txt; test ${PIPESTATUS[0]} -eq 0 && ./do_more_stuff.sh'

Beroende på om make lyckas eller inte så körs do_more_stuff.sh. Kan det vara något annat som påverkar?

Visa signatur

Abstractions all the way down.

Permalänk
Hedersmedlem
Skrivet av Biberu:

@Shimonu: Lyckas dessvärre inte återskapa det här. Skapade en first_do_this.sh som standin för din första operation, en makefile som antingen misslyckas eller bara inte gör något, samt pipar vidare som i ditt exempel, och det tycks fungera som förväntat (i Bash 4.3.30), både direkt och som alias:

alias mymake='./first_do_this.sh && make all 2>&1 | tee -a log.txt; test ${PIPESTATUS[0]} -eq 0 && ./do_more_stuff.sh'

Beroende på om make lyckas eller inte så körs do_more_stuff.sh. Kan det vara något annat som påverkar?

Då tänker jag rätt iaf. Sannolikt något i miljön som ställer till då. Har andra lustiga problem med bash. Grova problem med att parsa funktioner i bashrc till exempel och jag får det inte att gå ihop. Jobbar tyvärr i hemlig miljö så kan inte ge riktiga namn eller detaljer :/

Permalänk
Legendarisk

@Shimonu: Själv brukar jag undvika att skriva några längre / mer invecklade scripts i Bash så har tvärr inga förslag, men om miljön är krånglig i allmänhet så kanske kika på att lösa det med t.ex. Python eller Ruby istället?

Visa signatur

Abstractions all the way down.

Permalänk
Hedersmedlem

@Biberu: Tack, ska fundera på det men det känns spontant lite onaturligt Men bra tips!

Permalänk
Medlem

@Shimonu: skulle du kunna använda en bash-funktion istället för ett alias? Fungerar det om du kör kommandot manuellt utan alias?

Skickades från m.sweclockers.com

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Medlem

Skulle det gå att använda "set -e" först i aliaset och sedan ta bort alla villkor mellan kommandona?

Skickades från m.sweclockers.com

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Hedersmedlem
Skrivet av RiJo:

@Shimonu: skulle du kunna använda en bash-funktion istället för ett alias? Fungerar det om du kör kommandot manuellt utan alias?

Skickades från m.sweclockers.com

Får lite virrigt säga att jag har problem med att skapa bash-funktioner. Inte på grund av att jag inte vet hur men för att jag får väldigt udda parsningsfel när jag försöker köra source på scriptet. Även funktioner med enkla if-satser som jag Google-pastear får oförklarliga parse-fel. Men här kanske något uppenbarar sig för er

#!/bin/bash function my_func() { if [ "1" -eq "1" ]; then echo "hello" fi } my_func

Den koden går jättefint att anropa om jag lägger den i "my_script.sh" men försöker jag göra source my_script.sh så får jag unexpected token '}' som såklart pekar på slutet av funktionen. Att ha 'function' framför my_func är väl onödigt men verkar inte vara orsaken iaf.

Permalänk
Hedersmedlem

@Shimonu: misslyckas exact det skriptet ovan? Om jag bara kör copy/paste så funkar det fint för mig att köra på fyra olika sätt:
./test.sh
bash test.sh
source test.sh
. ./test.sh

Har bash 4.3.48(1)-release under Win 10 WSL (Ubuntu).
Om det misslyckas så gissar jag att det är någon bugg i en gammal version eller en halvobskyr inställning någonstans.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Hedersmedlem

@Thomas: Ja det misslyckas med exakt den koden. Får väl felsöka med kollegor om vi har tid någon gång.
Tillsvidare blir det att porta funktioner till Python