Hi Kartik,
What you need is something like this:
[ y$f.c -nt y$f.o ] && gcc -c y$f.c ; wait
Regards,
Raf
On Sat, Dec 03, 2016 at 10:23:21AM GMT, Kartik Agaram wrote:
> Synopsis: error with 'set -e' in /bin/sh
> Category: system
>
> Environment:
> System : OpenBSD 5.9
> Details : OpenBSD 5.9 (GENERIC) #1761: Fri Feb 26 01:15:04 MST 2016
> [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC
>
> Architecture: OpenBSD.amd64
> Machine : amd64
>
> Description:
>
> Bourne shell script with '-e' enabled sometimes runs past failing
> commands
>
> How-To-Repeat:
>
> I haven't been able to distill it down to a smaller testcase, so
> please bear with me.
>
> ## initial setup
>
> $ cat y0.c
> int foo() {
> return 34;
> }
>
> $ cat y1.c
> int bar () {
> return 35 /* some syntax error, say missing ';' */
> }
>
> $ touch y0.o y1.o
> $ touch y0.c y1.c # .c files newer than .o files
>
> $ cat build
> #!/bin/sh
> # stupid make replacement
> set -e
> for f in 0 1
> do
> echo checking y$f
> [ y$f.c -nt y$f.o ] && gcc -c y$f.c
> # echo # <=== line A disabled (see below)
> done
> echo ZZZ # should never get here since compiling y1.c errors
>
> ## first run
>
> $ ./build
> checking y0
> checking y1
> y1.c: In function 'main':
> y1.c:5: error: expected ';' before '}' token
> # no ZZZ printed; all is well
>
> ## second run
>
> $ touch y0.o # y0.o newer than y0.c, y1.o older than y1.c
>
> $ ./build
> checking y0
> checking y1
> y1.c: In function 'main':
> y1.c:5: error: expected ';' before '}' token
> ZZZ # <=== whoops!
>
> ## third run
>
> # uncomment line A in 'build' script
> $ cat build
> #!/bin/sh
> set -e
> for f in 0 1
> do
> echo checking y$f
> [ y$f.c -nt y$f.o ] && gcc -c y$f.c
> echo # <=== line A ENABLED
> done
> echo ZZZ
>
> # Now ZZZ never prints regardless of relative modified times.
>
> To summarize, the second run above shows a situation where /bin/sh
> executes commands after error in spite of 'set -e'. Furthermore,
> (third run) adding any *working* command to the loop *after* the
> failing command causes it to bail correctly on error.
>
> While this report was sent from OpenBSD 5.9, the error also occurs in
> the most recent snapshot.
>
> dmesg:
> OpenBSD 5.9 (GENERIC) #1761: Fri Feb 26 01:15:04 MST 2016
> [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC
> real mem = 788381696 (751MB)
> avail mem = 760381440 (725MB)
> mpath0 at root
> scsibus0 at mpath0: 256 targets
> mainbus0 at root
> bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xf6a20 (9 entries)
> bios0: vendor SeaBIOS version
> "rel-1.9.3-0-ge2fc41e-prebuilt.qemu-project.org" date 04/01/2014
> bios0: QEMU Standard PC (i440FX + PIIX, 1996)
> acpi0 at bios0: rev 0
> acpi0: sleep states S3 S4 S5
> acpi0: tables DSDT FACP APIC HPET
> acpi0: wakeup devices
> acpitimer0 at acpi0: 3579545 Hz, 24 bits
> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
> cpu0 at mainbus0: apid 0 (boot processor)
> cpu0: Virtual CPU 714389bda930, 2400.39 MHz
> cpu0:
> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,SSE3,PCLMUL,SSSE3,FMA3,CX16,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,HV,NXE,LONG,LAHF,ABM,FSGSBASE,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,ARAT
> cpu0: 64KB 64b/line 2-way I-cache, 64KB 64b/line 2-way D-cache, 512KB
> 64b/line 16-way L2 cache
> cpu0: ITLB 255 4KB entries direct-mapped, 255 4MB entries direct-mapped
> cpu0: DTLB 255 4KB entries direct-mapped, 255 4MB entries direct-mapped
> cpu0: smt 0, core 0, package 0
> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
> cpu0: apic clock running at 1000MHz
> ioapic0 at mainbus0: apid 0 pa 0xfec00000, version 11, 24 pins
> acpihpet0 at acpi0: 100000000 Hz
> acpiprt0 at acpi0: bus 0 (PCI0)
> acpicpu0 at acpi0: C1(@1 halt!)
> pvbus0 at mainbus0: KVM
> pci0 at mainbus0 bus 0
> pchb0 at pci0 dev 0 function 0 "Intel 82441FX" rev 0x02
> pcib0 at pci0 dev 1 function 0 "Intel 82371SB ISA" rev 0x00
> pciide0 at pci0 dev 1 function 1 "Intel 82371SB IDE" rev 0x00: DMA,
> channel 0 wired to compatibility, channel 1 wired to compatibility
> pciide0: channel 0 disabled (no drives)
> atapiscsi0 at pciide0 channel 1 drive 0
> scsibus1 at atapiscsi0: 2 targets
> cd0 at scsibus1 targ 0 lun 0: <QEMU, QEMU DVD-ROM, 2.5+> ATAPI 5/cdrom
> removable
> cd0(pciide0:1:0): using PIO mode 4, DMA mode 2
> uhci0 at pci0 dev 1 function 2 "Intel 82371SB USB" rev 0x01: apic 0 int 11
> piixpm0 at pci0 dev 1 function 3 "Intel 82371AB Power" rev 0x03: apic 0 int 9
> iic0 at piixpm0
> vga1 at pci0 dev 2 function 0 "Cirrus Logic CL-GD5446" rev 0x00
> wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation)
> wsdisplay0: screen 1-5 added (80x25, vt100 emulation)
> virtio0 at pci0 dev 3 function 0 "Qumranet Virtio Network" rev 0x00
> vio0 at virtio0: address 56:00:00:44:57:84
> virtio0: apic 0 int 11
> virtio1 at pci0 dev 4 function 0 "Qumranet Virtio Storage" rev 0x00
> vioblk0 at virtio1
> scsibus2 at vioblk0: 2 targets
> sd0 at scsibus2 targ 0 lun 0: <VirtIO, Block Device, > SCSI3 0/direct fixed
> sd0: 15360MB, 512 bytes/sector, 31457280 sectors
> virtio1: apic 0 int 11
> virtio2 at pci0 dev 5 function 0 "Qumranet Virtio Memory" rev 0x00
> viomb0 at virtio2
> virtio2: apic 0 int 10
> virtio3 at pci0 dev 6 function 0 "Qumranet Virtio RNG" rev 0x00
> viornd0 at virtio3
> virtio3: apic 0 int 10
> isa0 at pcib0
> isadma0 at isa0
> fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
> fd0 at fdc0 drive 1: density unknown
> pckbc0 at isa0 port 0x60/5 irq 1 irq 12
> pckbd0 at pckbc0 (kbd slot)
> wskbd0 at pckbd0: console keyboard, using wsdisplay0
> pms0 at pckbc0 (aux slot)
> wsmouse0 at pms0 mux 0
> pcppi0 at isa0 port 0x61
> spkr0 at pcppi0
> usb0 at uhci0: USB revision 1.0
> uhub0 at usb0 "Intel UHCI root hub" rev 1.00/1.00 addr 1
> nvram: invalid checksum
> uhidev0 at uhub0 port 1 configuration 1 interface 0 "QEMU QEMU USB
> Tablet" rev 2.00/0.00 addr 2
> uhidev0: iclass 3/0
> ums0 at uhidev0: 3 buttons, Z dir
> wsmouse1 at ums0 mux 0
> vscsi0 at root
> scsibus3 at vscsi0: 256 targets
> softraid0 at root
> scsibus4 at softraid0: 256 targets
> root on sd0a (e876e758f67a0bbc.a) swap on sd0b dump on sd0b
> WARNING: /mnt was not properly unmounted
> clock: unknown CMOS layout
>
> usbdevs:
> Controller /dev/usb0:
> addr 1: full speed, self powered, config 1, UHCI root hub(0x0000),
> Intel(0x8086), rev 1.00
> port 1 addr 2: full speed, power 100 mA, config 1, QEMU USB
> Tablet(0x0001), QEMU(0x0627), rev 0.00, iSerialNumber 42
> port 2 powered
>