Tuesday, May 7, 2024
 Popular · Latest · Hot · Upcoming
6
rated 0 times [  6] [ 0]  / answers: 1 / hits: 21723  / 2 Years ago, thu, september 1, 2022, 7:13:26

My friend asked me why this two simple script are not working in both shells:



Test File "abc.txt":



aaa
111
bbb
111
ccc
111
ddd


Script #1 (a):



#!/bin/sh
while read -r line ; do
echo "Processing $line"
done < <(grep 111 abc.txt)


Output:



./a: line 4: syntax error near unexpected token `<'
./a: line 4: `done < <(grep 111 abc.txt)'


Script #2 (b):



#!/bin/bash
while read -r line ; do
echo "Processing $line"
done < <(grep 111 abc.txt)


Output:



Processing 111
Processing 111
Processing 111


I checked bash and sh on my machine and if I understand this correct this is the same thing.



/bin/sh is just a link to /bin/bash:



-rwxr-xr-x  1 root root 938736 May 10  2012 bash
lrwxrwxrwx. 1 root root 4 Feb 13 10:20 sh -> bash


Can someone explain me where is the difference?


More From » bash

 Answers
6

It's because Bash behaves differently when $0 is sh.



From Bash's behaviour [Bash Hackers Wiki]:




SH mode



When Bash starts in SH compatiblity mode, it tries to mimic the
startup behaviour of historical versions of sh as closely
as possible, while conforming to the POSIX® standard as well. The
profile files read are /etc/profile and
~/.profile, if it's a login shell.



If it's not a login shell, the environment variable ENV is evaluated and the resulting
filename is taken as name of the startup file.



After the startup files are read, Bash enters the POSIX(r)
compatiblity mode (for running, not for
starting!)
.



Bash starts in sh compatiblity
mode when:

  • the base filename in
    argv[0] is sh (Attention dear uber-clever
    Linux users… /bin/sh may be linked to
    /bin/bash, but that doesn't mean it acts like
    /bin/bash)




More information can be found at the Bash Reference Manual: Bash POSIX Mode, specifically:





  • Process substitution is not available.




which is why your sh script is failing, as the <(..) syntax is using process substitution.


[#26943] Friday, September 2, 2022, 2 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
utilitere

Total Points: 394
Total Questions: 110
Total Answers: 114

Location: Solomon Islands
Member since Wed, Mar 29, 2023
1 Year ago
;