Redirection? (I do find some of the strangest things.)


 
Thread Tools Search this Thread
Top Forums UNIX for Advanced & Expert Users Redirection? (I do find some of the strangest things.)
# 1  
Old 01-10-2017
Redirection? (I do find some of the strangest things.)

(Apologies for any typos.)
Can someone help me with this one please.
I am writing a snippet that will come on here soon to work on OSX, Linux and CygWin but I hit this!

I hope this is lucid enough because I really do not understand what is going on.

Take these few lines:-
Code:
#!/bin/sh
# OR #!/usr/local/bin/dash
> /tmp/noise.raw
> /dev/null 2>&1 cat /tmp/noise.raw > /dev/dsp

And tested in ShellCheck gives this:-
Code:
$ shellcheck myscript
 
Line 3:
> /tmp/noise.raw
^-- SC2188: This redirection doesn't have a command. Move to its command (or use 'true' as no-op).

$

OK so I add a NOP:-
Code:
#!/bin/sh
# OR #!/usr/local/bin/dash
: > /tmp/noise.raw
> /dev/null 2>&1 cat /tmp/noise.raw > /dev/dsp

And tested in ShellCheck gives NO error:-
Code:
$ shellcheck myscript
No issues detected!

$

Why is a redirection to > /dev/null allowed to be a _direct_ redirection and yet : > /tmp/noise.raw requires a NOP?

Next question is this line, > /dev/null 2>&1 cat /tmp/noise.raw > /dev/dsp actually works to hide an OSX error, paraphrasing, 'I don't have permssion to access this' which is obvious as OSX does not have '/dev/dsp'.
This line also runs correctly on CygWin with > /dev/null 2>&1 at the start. So it looks like I have done something correct but don't know why?

TIA.

Barry.
# 2  
Old 01-10-2017
Shellsheck SC2188 message is not reporting an invalid syntax but is merely a warning telling there is a potential bug. Adding a no-op command makes the intention clear but it is not required.

The line:
Code:
> /dev/null 2>&1 cat /tmp/noise.raw > /dev/dsp

discards the potential error messages and it has a command (cat) so Shellcheck doesn't report an error with it.
This User Gave Thanks to jlliagre For This Post:
# 3  
Old 01-10-2017
Hmmm, quite some questions in one post. And, I can't comment for all thoses OSes nor all shells, nor on shellcheck. For bash on linux and FreeBSD,
- You can have any number of redirections in a command line any place; they're evaluated left to right, and the last one will be effective. Check what >/tmp/1 cat file1 > /tmp/2 > /tmp/3 does.
- In your line > /dev/null 2>&1 cat /tmp/noise.raw > /dev/dsp it might be interesting to check where the error msgs go. What be your first guess?
- You don't need a command nor a NOP; >/tmp/1 will just open the file, empty it, and close it. This can be (and is) used to effectively create an empty file.
- That shellcheck comment seems to be a warning, not an error. shells allow for that construct.
- Your conclusion about non-existence of /dev/dsp from the permission error might be incorrect.
# 4  
Old 01-10-2017
Hi RudiC...
Macbook Pro, OSX 10.12.2, default bash terminal.
Code:
Last login: Tue Jan 10 09:03:20 on ttys000
AMIGA:amiga~> > /dev/null 2>&1 cat /tmp/noise.raw > /dev/dsp
AMIGA:amiga~> cat /tmp/noise.raw > /dev/dsp > /dev/null 2>&1
-bash: /dev/dsp: Operation not permitted
AMIGA:amiga~> 
AMIGA:amiga~> 
AMIGA:amiga~> bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Copyright (C) 2007 Free Software Foundation, Inc.
AMIGA:amiga~> _

NOTE: '/tmp/noise.raw' does NOT exist and that the error must be trapped somewhere but the __system__ one is not trapped.
However jlliagre's post makes sense because I thought it might have generated a syntax error the way I have written it, but it didn't.
# 5  
Old 01-10-2017
A couple of comments:

- The error is still trapped (detected and reported), the message just happen not to be displayed on the terminal.

- Should a shell syntax error had existed in your command line, it would still have been displayed on the terminal. Redirections are performed after the command is parsed, syntax errors are detected during the parsing.
This User Gave Thanks to jlliagre For This Post:
# 6  
Old 01-10-2017
Did you check the exit code of the command in either case?
# 7  
Old 01-10-2017
Quote:
Originally Posted by RudiC
Did you check the exit code of the command in either case?
No. As it is unimportant; I just don't want it to show nor crash out when a relatively serious error occurs but to be ignored. These are three lines in the code to suit:-
1) \dev\dsp for CygWin, OSS and PulseAudio for Linux.
2) ALSA for Linux ALSA sound systems.
3) OSX 10.12.x or maybe earlier.
If any one fails just ignore and carry on to the next. One of them will work.
Code:
# CygWin /dev/dsp, Linux OSS or PulseAudio.
> /dev/null 2>&1 cat /tmp/noise.raw > /dev/dsp
# Linux ALSA.
aplay /tmp/noise.wav > /dev/null 2>&1
# Apple OSX 10.12.x and greater.
afplay /tmp/noise.wav > /dev/null 2>&1

As Apple OSX 10.7.x at least has 'afplay' by default on a virgin install then there should be no reason for the code to fail.
CygWin(64) has /dev/dsp in a default virgin install.
Linux is variable as it could have either ALSA, OSS or PulseAudio sound systems.
Login or Register to Ask a Question

Previous Thread | Next Thread

6 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Several exec on find send all the output to the last redirection

Example script: find mydir -type f -exec echo {}>aaa \; -exec echo {}>bbb \;The two paths go the the bbb file, while there should be one of them on each file. How should I do it to get it working? (2 Replies)
Discussion started by: Tribe
2 Replies

2. UNIX for Dummies Questions & Answers

Just trying to find out a few things ....

Hi everyone Just a couple of quick questions if I may. Can I ask what is meant by "flavours"?? I've come across it many times in the forums and I'm guessing that it is a variery of either Linux or UNIX (I know nil about either) which has developed but not really got a clue. ... (1 Reply)
Discussion started by: Tiramisu
1 Replies

3. UNIX for Advanced & Expert Users

shell redirection in find

hi, i need to clear data off a DOA backup drive. i try this, but just get a file {} in . and no change on the backup drive. bash shell find /mnt/usbbackup -xdev -type f -exec echo `date` > {} \; any ideas? thanks. :) (1 Reply)
Discussion started by: drewnichols
1 Replies

4. Programming

Question about several things in C

Hey guys, first of all I'd like to say Hi to everyone. I am new here and this is my first post. I have a question about some C stuff. I am in Computer Science and I have an assignment for a UNIX Applications course. It is really complicated, however. We're using the C language for this and... (1 Reply)
Discussion started by: V4D3R
1 Replies

5. Programming

Complicating things?

So basically what im trying to do is ... Open file, read that file, than try to find .. We or we and replace them with I, but not replace the cases where words contain We or we, such as Went, went, etc a and replace them with the, but not replace the cases where words contain a, such as... (1 Reply)
Discussion started by: bconnor
1 Replies

6. UNIX for Dummies Questions & Answers

i get the strangest feeling that lilo hates me.

i need to get rid of lilo's splash screen. i've heard that you can edit your /etc/lilo.conf and add this line: <b>append="splash=0"</b> anyway, i did that and i still have a splash screen. any idea why that didn't work, or what is another way to disable the splash screen? okay, -nydel (1 Reply)
Discussion started by: nydel
1 Replies
Login or Register to Ask a Question