Re: Segfault in Bash
On 14.7. 16:08, Chet Ramey wrote: On 7/14/20 6:32 AM, Jeffrey Walton wrote: ./audit-libs.sh: line 17: 22929 Segmentation fault (core dumped) $(echo "$file" | grep -E "*.so$") Bash is reporting that a process exited due to a seg fault, but it is not necessarily a bash process. As a suggestion: it might be useful if the error message showed the actual command that ran, after expansions. Here it shows the same command each time, and if only one of them crashed, you wouldn't immediately know which one it was. The un-expanded source line is in any case available in the script itself. The message also seems to be much briefer for an interactive shell or a -c script. At least the latter ones might also benefit from the longer error message. -- Ilkka Virta / itvi...@iki.fi
Re: Segfault in Bash
On 14.7. 13:32, Jeffrey Walton wrote: Hi Everyone, I'm working on a script to find all shared objects in a directory. A filename should match the RE '*.so$'. I thought I would pipe it to grep: IFS="" find "$dir" -name '*.so' -print | while read -r file do if ! $(echo "$file" | grep -E "*.so$"); then continue; fi echo "library: $file" done Are you trying to find the .so files, or run them for some tests? Because it looks to me that you're running whatever that command substitution outputs, and not all dynamic libraries are made for that. -- Ilkka Virta / itvi...@iki.fi
Re: Segfault in Bash
On 7/14/20 6:32 AM, Jeffrey Walton wrote: > Hi Everyone, > > I'm working on a script to find all shared objects in a directory. A > filename should match the RE '*.so$'. I thought I would pipe it to > grep: > > $ ./audit-libs.sh /home/jwalton/tmp/ok2delete/lib > ./audit-libs.sh: line 17: 22929 Segmentation fault (core dumped) > $(echo "$file" | grep -E "*.so$") > ./audit-libs.sh: line 17: 22934 Segmentation fault (core dumped) > $(echo "$file" | grep -E "*.so$") > ./audit-libs.sh: line 17: 22939 Segmentation fault (core dumped) > $(echo "$file" | grep -E "*.so$") > ... > > My code is broken at the moment. I know I am the cause of Bash's > crash. But I feel like Bash should not segfault. Bash is reporting that a process exited due to a seg fault, but it is not necessarily a bash process. Since the message is reporting a core dump, a backtrace from that would tell you what's faulting. -- ``The lyf so short, the craft so long to lerne.'' - Chaucer ``Ars longa, vita brevis'' - Hippocrates Chet Ramey, UTech, CWRUc...@case.eduhttp://tiswww.cwru.edu/~chet/
Re: Segfault in Bash
> > IFS="" find "$dir" -name '*.so' -print | while read -r file > > do > > if ! $(echo "$file" | grep -E "*.so$"); then continue; fi > > echo "library: $file" > > > > done Also, I forgot to point out: your "if" line is executing each of the shared libraries that you find. Every one of them matches the grep check, and since you enclosed the check in a command substitution, the output of grep (which is the pathname) is *executed* as a command. That's probably where your segfault is happening. Once you remove this completely unnecessary and incorrectly written check, the segfaults from running random shared library files as commands will stop happening.
Re: Segfault in Bash
On Tue, Jul 14, 2020 at 06:32:44AM -0400, Jeffrey Walton wrote: > $ ./audit-libs.sh /home/jwalton/tmp/ok2delete/lib > ./audit-libs.sh: line 17: 22929 Segmentation fault (core dumped) > $(echo "$file" | grep -E "*.so$") This grep regular expression is not valid. The * symbol in a regular expression means "0 or more of the previous thing", so you can never begin a regular expression with a * character. Also, the . character in a regex means "any one character", not a literal dot. If for some reason you actually wanted to grep for lines that end with the string ".so", it would be: grep '\.so$' However, the *use* of grep here is also incorrect. > My code is broken at the moment. I know I am the cause of Bash's > crash. But I feel like Bash should not segfault. > > IFS="" find "$dir" -name '*.so' -print | while read -r file > do > if ! $(echo "$file" | grep -E "*.so$"); then continue; fi > echo "library: $file" > > done I don't even understand what the grep is supposed to be *doing* here. You already know that each file processed by that check ends with .so because of the find command that you used. You could simply remove the "if" line altogether. IFS isn't actually doing anything, either. It only applies to the find command, not the other half of the pipeline. And of course, find (an external command) will just ignore it. What you really want is simply: find "$dir" -type f -name '*.so' -exec printf 'library: %s\n' {} + If your code is "just an example" (bashphorism 9), and you actually wanted to do MORE than print each filename, and thus you really did want a bash loop to process each file within the script, then you need to change a few things. Your existing loop will blow up on any filenames containing newlines. Also, because you used a pipeline, the loop runs in a subshell, so you can't set any variables and have them survive -- this may or may not be a problem, and we can't know because we don't know what the actual goal of the script is. A proper while loop to process the pathnames emitted by grep would look something like: while IFS= read -r -d '' f; do : secret stuff here done < <(find "$dir" -type f -name '*.so' -print0)
Segfault in Bash
Hi Everyone, I'm working on a script to find all shared objects in a directory. A filename should match the RE '*.so$'. I thought I would pipe it to grep: $ ./audit-libs.sh /home/jwalton/tmp/ok2delete/lib ./audit-libs.sh: line 17: 22929 Segmentation fault (core dumped) $(echo "$file" | grep -E "*.so$") ./audit-libs.sh: line 17: 22934 Segmentation fault (core dumped) $(echo "$file" | grep -E "*.so$") ./audit-libs.sh: line 17: 22939 Segmentation fault (core dumped) $(echo "$file" | grep -E "*.so$") ... My code is broken at the moment. I know I am the cause of Bash's crash. But I feel like Bash should not segfault. IFS="" find "$dir" -name '*.so' -print | while read -r file do if ! $(echo "$file" | grep -E "*.so$"); then continue; fi echo "library: $file" done Are you guys interested in the segfault?