Multiple executables in path (Was: NON-SOURCE POSTINGS CONSIDERED HARMFUL!)
Dan Bernstein
brnstnd at kramden.acf.nyu.edu
Fri Jan 25 01:21:39 AEST 1991
Ya want other behaviors? Fine, ya get other behaviors. These all use the
same strategy as the original.
Original:
echo `echo "$PATH" | tr : '\012' | sed -e 's:$:/!:1': -e 's:^:/.[.]:'`\
| sed 's:/\.\./:/:g'
The same thing, but with marks from ls showing the type of each file:
ls -dF `echo "$PATH" | tr : '\012' | sed -e 's:$:/!:1': -e 's:^:/.[.]:'`\
| sed 's:/\.\./:/:g'
The same thing, but following symbolic links:
ls -dFL `echo "$PATH" | tr : '\012' | sed -e 's:$:/!:1': -e 's:^:/.[.]:'`\
| sed 's:/\.\./:/:g'
The same thing, but showing only executables:
ls -dFL `echo "$PATH" | tr : '\012' | sed -e 's:$:/!:1': -e 's:^:/.[.]:'`\
| sed -n -e 's:/\.\./:/:g' -e '/*$/p'
The same thing, but removing the *:
ls -dFL `echo "$PATH" | tr : '\012' | sed -e 's:$:/!:1': -e 's:^:/.[.]:'`\
| sed -n -e 's:/\.\./:/:g' -e 's/*$//p'
The same thing, but showing only the first executable:
ls -dFL `echo "$PATH" | tr : '\012' | sed -e 's:$:/!:1': -e 's:^:/.[.]:'`\
| sed -n -e 's:/\.\./:/:g' -e 's/*$//p' | head -1
Same as the first one, but converting . in PATH into the actual cwd:
setenv WD "`pwd`"
echo `echo "$PATH" | tr : '\012' | sed -e 's:^\.$:'"$WD": -e 's:$:/!:1': -e 's:^:/.[.]:'`\
| sed 's:/\.\./:/:g'
The same thing, but with ./ instead of `pwd`/:
echo `echo "$PATH" | tr : '\012' | sed -e 's:^\.$:'"$WD": -e 's:$:/!:1': -e 's:^:/.[.]:'`\
| sed -e 's:/\.\./:/:g' -e 's:^'"$WD"'/:./:g'
You can easily combine these to make other behaviors if you want, e.g.,
to just show the first executable including in ., or whatever.
If you want to quote a command for csh or sh, e.g., to make a csh alias,
or to pass something to sh -c or csh -cf: Use quote and makealias, which
have been running around since I posted them in 1988. You can pick up a
pile of random shell tricks from pub/hier/misc/faq-shell via anonymous
ftp to 128.122.128.22.
If you want to put these in a script instead: Replace !:1 with '"$1"',
and top the script with #!/bin/csh -f.
If you want to accept aliases from .cshrc: Same, but remove the -f.
In article <5648 at idunno.Princeton.EDU> pfalstad at phoenix.Princeton.EDU (Paul Falstad) writes:
> If you don't agree with Dan, and want
> to fix the csh version to exclude non-executables, after deciphering the csh
> brain-damage you'd discover that there's no way to change it.
Again, the deciphering is as simple as ``alias which'', but it's a fair
accusation. Wrong, but fair.
> Perhaps
> since Dan can't fix his which, he's decided that it's OK the way it is.
An interesting thought.
> (That's only a suggestion. He probably does like which to have that behavior.)
Obviously.
> But Tom's solution can easily be changed to have either behavior.
So what? So can any reasonable solution.
> That's nice, but the fact is many people do have . in their path (it's
> last in the default path at our site). You're saying, "Well, my version
> doesn't work if you have . in your path, so don't put . in your path."
> "Doctor, it hurts when I do this." "So don't do that."
Again, wrong, though fair.
> Again I could ask, does your csh alias behave this way because you
> designed it to, or because there's no other way it could act?
I think I've answered that question.
> >)> Had you read the documentation of `which5', you would have known it's not
> >)> that trivial to get things right.
> >)Different people will prefer different behaviors of ``which''; [...]
> >Agreed. But some types of behavior are questionable at best, ridiculous
> >at worst.
> Dan prefers the behavior of his which because the crufty language it's
> written in allows no other behavior.
Now, now, don't make silly accusations without thinking things through
first.
---Dan
More information about the Alt.sources.d
mailing list