What's your most useful shell?


Poll: What's your most useful shell?
Poll Options
What's your most useful shell?

 
Thread Tools Search this Thread
Top Forums UNIX for Advanced & Expert Users What's your most useful shell?
# 183  
Old 01-25-2011
Quote:
Originally Posted by tetsujin
They aren't scoped, there's no control over whether they're exported (not that most programs would know what to do with an exported file descriptor anyway), there's nothing to protect you from clobbering one numeric FD with another...
The shell is a more direct interface to the environment and the kernel than a lot of people realize. File numbers in shell are the file descriptor numbers the kernel has actually assigned to this process, nothing more, nothing less. Environment variables (though not non-exported variables) are expected to be put in a specific spot of memory and organized in a very specific way, to allow non-shell things to use them. This has certain problems as you've noticed. It also means you can use the shell as really low-level setup for something else, as there's no nonsense in the way of you opening whatever files you want as whatever descriptors you need. Kind of the original purpose of the shell -- setting up for something else.

Moving away from the model the kernel presents you would make it a more capable language, and a less capable shell.

Last edited by Corona688; 01-25-2011 at 07:01 PM..
# 184  
Old 01-31-2011
Quote:
Originally Posted by Corona688
The shell is a more direct interface to the environment and the kernel than a lot of people realize. File numbers in shell are the file descriptor numbers the kernel has actually assigned to this process, nothing more, nothing less.
The same is true of file descriptors in C - but when you call open() to open a file there's no chance of accidentally closing a file you had open - the newly-opened file is assigned to a previously unallocated file descriptor.

So there's that basic problem of syntax when using redirection syntax to open files... That much could be solved pretty easily. (Actually, I guess Bash already has it pretty much licked: "exec {newfd}<filename"... $newfd takes on the newly allocated file descriptor number...)

But why stop there? There's no reason the shell couldn't tie the idea of an "open file" (within the shell) to a specialized, non-exportable variable, which offers the possibility of scoping and reference-counting the file descriptor, closing it when it's unused within the shell process. This would also give us a natural way to express whether the file descriptor should be "exported" to child processes (i.e. whether it's kept open through a fork()/exec()) - if the variable is exported, the child process gets an environment variable with a file descriptor number in it, and that file is open. If it's not, the file descriptor is closed on (or before) exec().

There's no reason numeric redirections couldn't still be made available for those cases where you need to control exactly where an open file ends up for a specific child process. I think that's just not the common case. The common case is that people want to read from or write to files. The bash/zsh syntax that allows opening a file and assigning its descriptor to a variable is a step in the right direction, but I think there's no reason things couldn't be improved further.

Quote:
Environment variables (though not non-exported variables)
I want to point out that exception because it's an important one. Variables implemented in shells are already removed from the reality of the underlying mechanism of environment variables. You've got integer variables, array variables, hash table variables... Shells provide these special cases despite the fact that they don't fit the underlying environment variable mechanism (and, therefore, can't be exported) because they're useful.

Quote:
Moving away from the model the kernel presents you would make it a more capable language, and a less capable shell.
Well, granted, though with caveats.

Let's suppose, for instance, I actually were proposing a shell design that wouldn't allow for numeric redirection, and that I were running one of the few programs for which that feature is actually useful. (I only know of a few - xterm, screen - can't think of any others...) Then, yes, something of value was lost.

But this doesn't mean that working with raw resources must be the default means of interacting with the shell - only that it must be available, and that the shell's normal mode of operation shouldn't be too far removed from this. The raw control should be there when you need it, and out of the way the rest of the time.
# 185  
Old 02-04-2011
Quote:
Originally Posted by tetsujin
But why stop there? There's no reason the shell couldn't tie the idea of an "open file" (within the shell) to a specialized, non-exportable variable, which offers the possibility of scoping and reference-counting the file descriptor, closing it when it's unused within the shell process.
The only time the shell knows it's done with a file descriptor is when it quits! It's not psychic...
Quote:
...But this doesn't mean that working with raw resources must be the default means of interacting with the shell
If it doesn't give you a minimal model of the kernel's I/O, I don't think you could call it a shell.
Quote:
The raw control should be there when you need it, and out of the way the rest of the time.
If you don't want to use a shell language, don't use a shell language. A great deal of underlying assumptions of the process model -- stdin/stdout and by extension all pipes and redirection -- depend on the model we have. Don't ruin things for the rest of us because you want contradictory properties...
# 186  
Old 02-18-2011
these is again depends on the user he prefers but - easy t ore-call last any commands instead you type they all from start - ksh -o vi
# 187  
Old 02-27-2011
Quote:
Originally Posted by Corona688
The only time the shell knows it's done with a file descriptor is when it quits! It's not psychic...
Wrong. The other time it knows it's done with a file descriptor is when that file descriptor is closed.

So why should "exec $fd<&-" be the only way to tell the shell it's time to close a file descriptor?

That's all I'm describing here - just another way to control the lifetime of an open file descriptor in a shell. The shell doesn't need to be psychic in order to know when a local variable goes out of scope, or when a global variable is unset. That's all you need for the RAII method of resource management.

If an open file descriptor in the shell is tied to the lifetime of a variable binding - what is the scenario in which that file needs to be open, but isn't because the shell decided it was time to close it?

Quote:
If it doesn't give you a minimal model of the kernel's I/O, I don't think you could call it a shell.
It seems to me you have an extraordinarily limited view of what qualifies as a shell.

And, you know, I don't expect you're the only one. When I look at the problem of trying to enhance the shell (and I understand that what I consider "enhancement" others may very well consider garbage) - it seems likely to me that most of the people who actually still use the shell, probably don't want to see it change in any significant way. If they wanted to use something else, they probably already would be.

Nevertheless, I want to try to make something better.

Quote:
If you don't want to use a shell language, don't use a shell language.
I want to make a better shell language. I like the basic approach of the Unix shell but I think there's room for improvement in the execution. I mean, seriously - do you think the existing shell is perfect? Really?

Obviously, there is a chance that anything I come up with won't be an improvement. It may not even be worth running at all. Who knows? But we don't get nice things if people don't try to strike out in a new direction once in a while.

Quote:
A great deal of underlying assumptions of the process model -- stdin/stdout and by extension all pipes and redirection -- depend on the model we have. Don't ruin things for the rest of us because you want contradictory properties...
I really don't understand why you think anything I've suggested would change that model, or break those assumptions.

But don't worry, I won't ever break into your machine and replace your shell. :P'
# 188  
Old 02-27-2011
Quote:
Originally Posted by tetsujin
Wrong. The other time it knows it's done with a file descriptor is when that file descriptor is closed.
Which is the model we have already. Your point?
Quote:
So why should "exec $fd<&-" be the only way to tell the shell it's time to close a file descriptor?
A few good reasons:

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.

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. (Unless, as above, you add special cases for compatibility, which makes the language a mess instead). This is supposed to be easy in a shell.

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


Last edited by Corona688; 02-27-2011 at 07:51 PM..
# 189  
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.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. 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

2. 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

3. 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

4. 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

5. 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

6. 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

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

8. 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

9. 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

10. 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
Login or Register to Ask a Question