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...)
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?
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.
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)
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)
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)
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)
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)
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)
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)
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)