Sponsored Content
Top Forums UNIX for Advanced & Expert Users What's your most useful shell? Post 302500272 by tetsujin on Monday 28th of February 2011 05:19:06 AM
Old 02-28-2011
Quote:
Originally Posted by Corona688
Which is the model we have already. Your point?
My point is that adding scoped lifetime management to file descriptors in a shell wouldn't fall nearly as far outside the current model as you suggest.

Quote:
1) Right now there's no "special" files in a shell, you can do as you please even with stdin/stdout/stderr. Adding new features that act in different ways would have to work around these basic three if you want "echo asdf | something" to still work, making the language much less orthogonal.
So what's the problem? I don't see how anything I've described impacts file descriptors 0-2 or pipelining in general.

Quote:
2) Making opening, closing, and inheriting files more complicated makes the whole process of piping data between commands more complicated since it uses the same files and mechanisms.
By "between commands" you mean between external commands, i.e. programs on the PATH, right? As opposed to shell functions, shell extensions, etc...

When the shell hands a file descriptor to a process (on exec()), it doesn't have to care what that process does with the FD. The underlying mechanism is as it always has been: the file occupies a numbered slot in the new process's file descriptor table.

Quote:
(Unless, as above, you add special cases for compatibility, which makes the language a mess instead).
It can be hard to come up with a good syntax when you're trying to serve multiple needs. I don't believe there's any reason this feature would make a mess of the syntax, however. If the variable $f is a "file" object (i.e. an open file descriptor, assigned some numeric FD within the shell itself which the user actually doesn't need to know...)

Code:
read x < $f   #Is that quite simple enough?  Alternately, "read x <&$f" would make it plain that $f is an open file and not a filename.  A shell could support either syntax, or both.
some_command 8<&$f   #And there's no reason it couldn't work with the existing numeric redirection syntax either...
some_command $f   # It's actually not too hard to make this do what the user intends...

There's a couple ways the last one could be handled:

First, the shell could handle it like process redirection: assign the file $f some numeric FD in the new process, then in place of the argument $f, substitute /dev/fd/(some number)
Second, it could be as above but with just the numeric FD rather than the /dev/fd path. Considering how few command-line tools actually provide any support for doing something with a numeric FD other than 0-2, it probably doesn't matter - though the first approach would work with more commands since /dev/fd/* can be used like any other filename...
Alternately, the shell could reject this as a type error. It's an easy enough condition to detect, and the shell could even provide a useful error message, explaining that you have to use redirection syntax to pass an open file descriptor to a process.

Honestly, the whole /dev/fd thing in process substitution always struck me as kind of hokey... Though that may just be because I hadn't heard of /dev/fd before (/dev/tcp struck me as even more hokey - in large part because the directory doesn't exist...) But it does its job, supplies the identity of an open file descriptor to a command being called as if it were a filename...

Quote:
3) You're ignoring perfectly good existing features. The "exec" opening methods and explicit file descriptor numbers often aren't necessary at all. How's this for a scoped file descriptor that closes itself?

Code:
while read LINE
do
        echo "${LINE}"
done <filename

I think that takes care of "scoped", as you say - though the syntax could be better (you increase the nesting level each time you add an additional file, unless you open all the files in the same place... And if I'm not mistaken, the files can only be opened at the end of the block (I tried it at the beginning of a block, in bash, and it didn't work), which is kind of awkward IMO. When reading code I think it's more useful to be able to see what file is what at the point you start using them.

It's fine to point at an example where you're just reading one file, or reading one file and writing another, and say you don't need to deal with numeric FDs in the shell. But if you're opening more than one for reading, or you have different subroutines that are all operating on different files, then you certainly do need to think about where those files are going to go.

Bash already provides a syntax for auto-assigning a file descriptor when opening a file, of course - and that goes a long way toward making the situation nicer: you can open the file, pick an FD for it, and assign the number of that FD to an environment variable all with a compact bit of redirection syntax. That's about what you get from using file descriptors in C - the programmer takes responsibility for not overwriting the variable containing an important file descriptor and also takes responsibility for closing file descriptors when it's time. It's quite workable, really. Going C++ style with RAII and so on isn't strictly necessary, it just strikes me as something that could be useful.

But, of course, the proof is in the implementation. Whether or not an idea sounds good, specifics of execution can make all the difference.
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to run unix commands in a new shell inside a shell script?

Hi , I am having one situation in which I need to run some simple unix commands after doing "chroot" command in a shell script. Which in turn creates a new shell. So scenario is that - I need to have one shell script which is ran as a part of crontab - in this shell script I need to do a... (2 Replies)
Discussion started by: hkapil
2 Replies

2. AIX

Difference between writing Unix Shell script and AIX Shell Scripts

Hi, Please give me the detailed Differences between writing Unix Shell script and AIX Shell Scripts. Thanks in advance..... (0 Replies)
Discussion started by: haroonec
0 Replies

3. Linux

How to Start a Shell as Login shell instead of ordinary shell

Hi I tried with bash --login option. but the output is siva:~$ bash --login siva:~$ is there any way to make the shell ask for user id and password ( and login as different user instead of using sudo / su ) Thx in advance Siva (3 Replies)
Discussion started by: Sivaswami
3 Replies

4. Shell Programming and Scripting

Help need to make a shell script run for ffmpeg vhook watermaking in shell

i have a small problem getting a batxh shell script to run in shell this is the code the problem seems to be centered around the ffmpeg command, something maybe to do with the ' ' wrapping around the vhook part command this is a strange problem , if i take the ffmpeg command and... (1 Reply)
Discussion started by: wingchun22
1 Replies

5. Shell Programming and Scripting

How to run cmds after changing to a new env (shell) in a shell script

Hi, I am using HP-UNIX. I have a requirement as below I have to change env twice like: cadenv <env> cadenv <env> ccm start -d /dbpath ccm tar -xvf *.tar ccm rcv .... mv *.tar BACKUP but after I do the first cadenv <env> , I am unable to execute any of the later commands . ... (6 Replies)
Discussion started by: charlei
6 Replies

6. Shell Programming and Scripting

simple shell - how to get a parameter typed in a shell script

Hi, I am new to unix and using linux 7.2. I would like to create a script that would make it easyer for me to run my java programms. At the moment I have to type java myJavaprogram I am trying to write a script that will allow me to type something like this "myscript myJavaprogram" or maybe... (4 Replies)
Discussion started by: cmitulescu
4 Replies

7. Shell Programming and Scripting

calling 'n' number of shell scripts based on dependency in one shell script.

Hello gurus, I have three korn shell script 3.1, 3.2, 3.3. I would like to call three shell script in one shell script. i m looking for something like this call 3.1; If 3.1 = "complete" then call 3.2; if 3.2 = ''COMPlete" then call 3.3; else exit The... (1 Reply)
Discussion started by: shashi369
1 Replies

8. Shell Programming and Scripting

Any shell or hack that makes the shell command line take vi commands?

basically i'm tired of hitting the left arrow a few dozen times when correcting a mistake or modifying a history command i'd like to use vim style key shortcuts while on the command line so that a 55 moves the cursor 55 places to the left... and i want all the other vi goodies, search of... (3 Replies)
Discussion started by: marqul
3 Replies

9. UNIX for Dummies Questions & Answers

Shell script to read lines in a text file and filter user data Shell Programming and Scripting

sxsaaas (3 Replies)
Discussion started by: VikrantD
3 Replies

10. Shell Programming and Scripting

Pass C shell array to another C shell script(csh) and shell(sh)

Dear Friends, Please help me on this my script name is send.csh In this i have written the statement like this set args = ( city state country price ) I want to pass this array to another c shell called receiver.csh. and i want to use it in this c shell or how to pass to... (2 Replies)
Discussion started by: SA_Palani
2 Replies
All times are GMT -4. The time now is 04:07 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy