[Bash] Problem att fånga pipestatus i alias

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

[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...

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

@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?

Abstractions all the way down.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006
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 :/

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

@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?

Abstractions all the way down.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2002

@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

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2002

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

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

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006
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.

Trädvy Permalänk
Hedersmedlem
Plats
Uppsala
Registrerad
Jul 2001

@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.

X370 Taichi / R7 1700 @ 3.75 GHz 1.2 V / 2x8 GB 3200 MHz CL16 / MSI GTX 1070 Gaming, OC / Samsung 960 EVO 500 GB / Corsair RM650x
LG G6 (H870)

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

@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