Abbreviated aliasing would be a great feature to bring to shells


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Abbreviated aliasing would be a great feature to bring to shells
# 1  
Old 08-27-2019
Abbreviated aliasing would be a great feature to bring to shells

Being able to mark in an alias definition a point of minimal abbreviation, an old feature of VAX/VMS shell (DCL) would be really nice in modern *nix shells.

In DCL you used to be able to define an alias (in its own weird syntax) which would be something like this:

Code:
$ alias fuz*zyanimals="cat dog"

The asterisk marks minimal unique abbreviation for the alias, such that all of the following invocations would work:
Code:
fuz
fuzz
fuzzy
fuzzya
fuzzyan
fuzzyanim
fuzzyanima
fuzzyanimal
fuzzyanimals


Last edited by Scrutinizer; 08-29-2019 at 11:14 AM.. Reason: code tags
# 2  
Old 08-27-2019
so, fuz or fuzzyanimals (or any string in between) will all evaluate "cat dog"? Why not just use fuz?

Last edited by RavinderSingh13; 02-28-2020 at 02:08 AM..
This User Gave Thanks to rdrtx1 For This Post:
# 3  
Old 08-27-2019
Have you had a look at bash completion scripts? These are quite powerful and configurable.

The simplest example with fixed list of arguments:

Code:
$ complete -W "cat dog" fuz
$ fuz <tab><tab>
cat     dog
$ fuz c<tab>

Another example if fuz takes directory as 1st parameter:
Code:
$compete -A directory fuz
$ fuz <tab><tab>
bin/  code/ perl/  photos/ proj/
$ fuz p<tab><tab>
perl/ photos/ proj/

There is also the ability to fully program the operation of the complete using a function which can be fully tailored to your needs.
These 2 Users Gave Thanks to Chubler_XL For This Post:
# 4  
Old 08-29-2019
Quote:
Originally Posted by unscripted
Being able to mark in an alias definition a point of minimal abbreviation, an old feature of VAX/VMS shell (DCL) would be really nice in modern *nix shells.

In DCL you used to be able to define an alias (in its own weird syntax) which would be something like this:

$ alias fuz*zyanimals="cat dog"

The asterisk marks minimal unique abbreviation for the alias, such that all of the following invocations would work:
fuz
fuzz
fuzzy
fuzzya
fuzzyan
fuzzyanim
fuzzyanima
fuzzyanimal
fuzzyanimals
Short of forking bash and modifying alias, I don't think there is a way to do what you want. However, this bash function will pollute your environment with lots of aliases. To make things easier I make the assumption that all abbreviations will start at 3 letters and I make no tests for the length of the alias being shorter than 3 letters. Use at your own risk! Smilie

Code:
nalias() {
   local fulline="$*"
   local xalias=${fulline#*=}
   local name=${fulline%%=*}
   local i
   for i in $(seq 3 ${#name})
   do 
      alias ${name::$i}="$xalias"
   done
}

Example:
Code:
$ nalias fuzzyanimals='cat dog'
$ alias | grep fuz
alias fuz='cat dog'
alias fuzz='cat dog'
alias fuzzy='cat dog'
alias fuzzya='cat dog'
alias fuzzyan='cat dog'
alias fuzzyani='cat dog'
alias fuzzyanim='cat dog'
alias fuzzyanima='cat dog'
alias fuzzyanimal='cat dog'
alias fuzzyanimals='cat dog'
$ fuzzyanim
cat: dog: No such file or directory
$

It would probably be possible to add the asterisk marker into the code to split the alias into minimal abbreviation + rest of alias, then add the latter to the former one letter at a time in a similar manner to the above. But this works for the two aliases I tried it on!

Andrew

Last edited by apmcd47; 08-29-2019 at 11:00 AM.. Reason: Forgot to say this is using bash
# 5  
Old 08-29-2019
Quote:
Originally Posted by apmcd47
It would probably be possible to add the asterisk marker into the code to split the alias into minimal abbreviation + rest of alias, then add the latter to the former one letter at a time in a similar manner to the above.
Think this should do what you describe:

Code:
nalias() {
   local fulline="$*"
   local xalias=${fulline#*=}
   local name=${fulline%%=*}
   local pre=${name%%\**}
   local i

   [ "$pre" == "$name" ] && name=""
   name=${name#${pre}\*}

   for((i=0; i <= ${#name}; i++))
   do
      alias $pre${name:0:$i}=$xalias
   done
}

Of course for i in $(seq 0 ${#name}) can be used in place of the above for(( code for more compatibility with older shells, at the cost of some speed.
This User Gave Thanks to Chubler_XL For This Post:
# 6  
Old 08-30-2019
No, better stick to the for(( bashism, it goes in tune with the ${name:0:$i} bashism!
Also seq is an external command, not available in some OS.

These kind of shortcuts are for an interactive shell.
Bash has the tab key for expansions.
The completion stuff as in post#3 is the correct way.
Login or Register to Ask a Question

Previous Thread | Next Thread

8 More Discussions You Might Find Interesting

1. What is on Your Mind?

Pearls before swine could be abbreviated PBS

I have these mental shorthands, e.g., OPC for other people's code/children, so when a wise suggestion is ignored, I thought, pearls before swine, but the acronym PBS is already taken. Maybe it's an inside joke? (0 Replies)
Discussion started by: DGPickett
0 Replies

2. Solaris

Directory Aliasing

Hello, I need to rediret the directory location at run time as:- If I type cd /dir1/dir2 then it should take me to /dir1/dir3 at run time. Inside dir1, both dir2 and dir3 directories are present. Could anyone guild me over it? Thanks Shubham (5 Replies)
Discussion started by: shubh05
5 Replies

3. Homework & Coursework Questions

aliasing command

hi to all members in this forums .. Nice to meet you... i only have a questions about command utility of "dd": for example i will type: pico trial this is my file. and save it and type chmod a+x trial can there be a way that instead of typing: dd if=trial of=trial.copy conv=ucase... (3 Replies)
Discussion started by: marahtia
3 Replies

4. UNIX for Dummies Questions & Answers

How can I do aliasing in shellscript?

#Example.sh alias rmv 'sh Example2.sh' when i execute exapme.sh alias name not working. how i solve this problem?? (9 Replies)
Discussion started by: arun508.gatike
9 Replies

5. UNIX for Advanced & Expert Users

aliasing the TO name in Unix mails

HI All, I have a small question/clarification/doubt . Does anyone know how to provide alias in the mails that come from Unix servers. Like i have a Unix server that generates status mails every hour for a scheduled job , it sends me mails with status with the ID in from field as... (3 Replies)
Discussion started by: bsandeep_80
3 Replies

6. UNIX for Dummies Questions & Answers

aliasing question in UNIX

Folks; I know this might sound stupid, but Can i alias a web link to another web link in a UNIX server? Let say i have a web link named http://test.new.com/wiki Can i alias that so when i click on it or i type it in the browser address it opens but the link in the browser say something like:... (1 Reply)
Discussion started by: Katkota
1 Replies

7. UNIX for Dummies Questions & Answers

What is IP aliasing ?

Hi, Can anyone tell me what is IP aliasing ? I do not know if this is the right place for this thread !!. Thanks in advance, Gideon. (2 Replies)
Discussion started by: preethgideon
2 Replies

8. UNIX for Dummies Questions & Answers

Basic regarding aliasing

Hi All, One small request. In UNIX/LINUX we can have our own aliases in .bashrc file. My doubt is when we add a new alias and if it is tried in already opened terminals it will not work, may be it is not going to recognise. Bit when we use the same alias in new terminal it will work. I... (1 Reply)
Discussion started by: chanakyahere
1 Replies
Login or Register to Ask a Question